MatLab错误:无法打开静态TLS

时间:2013-10-09 09:37:30

标签: matlab libraries lapack blas dlopen

几天以来,我在使用MATLAB时经常会收到同样的错误,这个错误发生在dlopen的某个时刻。我是MATLAB的新手,这就是为什么我不知道该怎么做。谷歌似乎也没有帮助我。当我尝试制作一个特征向量时,我得到了这个:

Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS

我在进行乘法时也得到了这个:

Error using  * 
BLAS loading error:
dlopen: cannot load any more object with static TLS

我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么做。这些是我找到的主题:

  1. How do I use the BLAS library provided by MATLAB?
  2. http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html
  3. 有人能帮助我吗?

    演示此错误的函数调用示例

    >> randn(3,3)
    
    ans =
    
     2.7694    0.7254   -0.2050             
    -1.3499   -0.0631   -0.1241             
     3.0349    0.7147    1.4897            
    
    >> eig(ans)
    
    Error using eig
    LAPACK loading error:
    dlopen: cannot load any more object with static TLS
    

10 个答案:

答案 0 :(得分:103)

自R2012b(8.0)以来已知的MATLAB的bug no 961964。 MATLAB使用静态TLS动态加载一些库(线程本地存储,例如参见gcc编译器标志-ftls-model)。加载太多这样的libs =>没有空间了。

直到现在,mathwork的唯一解决方法是首先使用它们加载重要的(!)库(他们建议在startup.m中放置“ones(10)* ones(10);”)。我最好不要对这个“解决方案策略”发表评论。

自R2013b(8.2.0.701)以及Linux x86_64以来,我的经验是:不要使用“doc”(图形帮助系统)!我认为这个doc-utility(libxul等)使用了很多静态TLS内存。

这是更新(2013/12/31)

所有以下测试均使用Fedora 20(使用glibc-2.18-11.fc20)和Matlab 8.3.0.73043(R2014a预发布)进行。

有关TLS的详细信息,请参阅 Ulrich Drepper,ELF处理线程局部存储,版本0.21,2013, 目前位于AkkadiaRedhat

究竟发生了什么?

动态MATLAB(使用dlopen)加载几个需要初始化的库。所有这些库都需要dtv中的插槽(动态线程向量)。因为MATLAB在编译/链接时在运行时动态加载其中几个库,所以链接器(在mathworks上)没有机会计算所需的插槽(这是重要的部分)。现在,动态lib加载程序的任务是在运行时处理这种情况。但这并不容易。引用dl-open.c:

  

对于静态TLS,我们必须在这里分配内存   现在。这包括在DTV中分配内存。但我们   不能改变我们自己以外的任何DTV。所以,如果我们   不能保证我们没有DTV的空间   即使尝试也无法加载。

在glibc的动态lib加载器中有一个编译时常量(称为DTV_SURPLUS,请参阅glibc-source / sysdeps / generic / ldsodefs.h),用于为这样的混乱保留大量额外的插槽(使用静态TLS动态加载库)在多线程程序中)。在glibc-Version of Fedora 20中,这个值是14。

以下是我的案例中需要dtv插槽的第一个libs(运行MATLAB):

matlabroot/bin/glnxa64/libut.so
/lib64/libstdc++.so.6
/lib64/libpthread.so.0
matlabroot/bin/glnxa64/libunwind.so.8
/lib64/libuuid.so.1
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/server/libjvm.so
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libfontmanager.so
matlabroot/sys/java/jre/glnxa64/jre/lib/amd64/libt2k.so
matlabroot/bin/glnxa64/mkl.so
matlabroot/sys/os/glnxa64/libiomp5.so
/lib64/libasound.so.2
matlabroot/sys/jxbrowser/glnxa64/xulrunner/xulrunner-linux-64/libxul.so
/lib64/libselinux.so.1
/lib64/libpixman-1.so.0
/lib64/libEGL.so.1
/lib64/libGL.so.1
/lib64/libglapi.so.0

是14以上=>太多了=> dtv中没有剩下的插槽。这就是错误消息试图告诉我们的内容,特别是数学。

记录:为了不违反MATLAB的许可,我没有调试,反编译或反汇编MATLAB附带的二进制文件的任何部分。我只调试了Fedora 20的free和open glibc-binaries,MATLAB用它来动态加载libs。

可以做些什么来解决这个问题?

有3种选择:

(a)中 重建MATLAB并不动态加载这些库 (使用initial-exec tls模型)而不是链接它们(然后链接器 可以计算所需的插槽!)

(b)中 重建这些库并确保它们不使用initial-exec tls模型。

(c)中 重建glibc并增加DTV_SURPLUS  的glibc / sysdeps /通用/ ldsodefs.h

显然,选项(a)和(b)只能由mathworks完成。

对于选项(c),不需要MATLAB源,因此可以在没有数学工作的情况下完成。

mathworks的状态是什么?

我真的试图向“MathWorks技术支持部门”解释这个问题。但我的印象是:他们不了解我。他们关闭了我的支持票,并在2014年1月与技术支持经理建议了电话(!)对话。

我会尽力解释这一点,但说实话:我不是很自信。

更新(2014/01/10):目前mathworks正在尝试选项(b)。

更新(2014/03/19):对于文件libiomp5.so,您可以在mathworks bug report 961964下载新编译的版本(无静态TLS)。还有其他的库?没有改善。所以不要惊讶于“dlopen:无法使用”doc“加载任何更多带有静态TLS的对象,例如见bug report 1003952

答案 1 :(得分:27)

重启Matlab为我解决了这个问题。

答案 2 :(得分:6)

长话短说:在你启动matlab的目录中创建一个文件  startup.m,内容为ones(10)*ones(10);。重新启动matlab,它将被处理。

答案 3 :(得分:4)

http://www.mathworks.de/support/bugreports/961964已于2014年1月30日更新。 libiomp5.so附带了一个zip文件 我用Matlab R2013b在Mageia 4 x86_64上测试了它。 我现在可以使用Matlab文档打开一个没有任何问题的演示。

答案 4 :(得分:4)

正如我所发现的那样,MathWorks尚未解决这个古老的问题。

这是我的两分钱,对我有用(当我想要IT ++外部库时,使用MEX)。

让您找到的库是问题的原因“libXYZ.so”,并且您知道它在系统中的位置。

解决方案是通知MATLAB在其启动的最早时加载特定的库。出现此错误的原因显然是由于缺少此thread local storage又称tls目的的插槽(由于它们已被填满)。

因为最新的编译突然需要一个在启动时没有加载的新库,所以MATLAB会抛出这个错误。

遗憾的是,MATLAB从未关心这个问题。

幸运的是,解决方案是一个非常简单的终端命令。

linux-machine上的典型步骤应如下:

  1. 打开命令提示符(Ubuntu中的Ctrl+Alt+T
  2. 发出以下命令
      

    export LD_PRELOAD =< PATH-TO-libxyz.so>

  3. 例如:export LD_PRELOAD=/usr/local/lib/libitpp.so

    1. 从同一终端启动matlab
        

      matlab&

    2. 现在运行程序应解决问题,就像我的情况一样。

      祝你好运!

      参考:

      [1] http://au.mathworks.com/matlabcentral/answers/125117-openmp-mex-files-static-tls-problem

答案 5 :(得分:3)

我有同样的问题,我想我刚解决了。

安装matlab时使用自定义安装(我第一次没有这样做)。选择在预定义文件夹(/ usr / local / bin)中创建指向matlab脚本的符号链接。这对我来说很有用!

答案 6 :(得分:3)

我对Matlab 2013b和Matlab 2014a都有同样的问题。 mathworks为libiomp5.so提供的修复只能解决LAPACK无法正常工作的问题。但是,我无法使用使用OpenMp的外部库(例如VL_FEAT):我仍然收到错误 “dlopen:无法使用静态TLS加载任何其他对象。”

唯一对我有用的是降级到Matlab 2012b。

答案 7 :(得分:2)

我在" bar"之后遇到了这个问题。 (对于条形图)带有一个数组只给我一个蓝色块,没有抛出错误。重启首先解决了问题。但是在发生内存错误(处理一个非常大的文件之后)之后,我只是无法解决这个蓝色块问题。

使用" hist"在矩阵输入上给出了" BLAS加载错误"问题,并引导我到这个线程。 Mathwork解决方法修复了hist和bar问题。

只是想让人们认识到这个错误的影响程度。

答案 8 :(得分:0)

我有同样的问题并通过增加我的Java堆内存来解决它。转到首选项>一般> Java-Heap Memory,增加分配的内存。

答案 9 :(得分:0)

在R2013b / Ubuntu 12.04上,增加Java堆内存(至512 MB)也适用于我。当我处理一个11 GB的文件(16 GB RAM)时,“BLAS加载错误”开始了,并且在增加java堆内存并重新启动matlab后没有重现。