MatLab错误:无法用静态TLS打开
自从几天以来,我一直在使用MATLAB在dlopen
某个时刻发生同样的错误。 我对MATLAB很新,这就是为什么我不知道该怎么做。 谷歌似乎也没有帮助我。 当我尝试创build一个特征向量时,我得到这个:
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
我当然想find解决这个问题的办法,但我不太了解,不知道该怎么办。 这些是我find的线程:
- 我如何使用MATLAB提供的BLAS库?
- http://www.mathworks.de/de/help/matlab/matlab_external/calling-lapack-and-blas-functions-from-mex-files.html
有人能帮助我吗?
函数调用的例子演示了这个错误
>> 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
这是自R2012b(8.0)以来已知的MATLAB No.961964。 MATLAB使用静态TLS(线程本地存储,例如,参见gcc编译器标志-ftls-model)dynamic加载一些库。 加载太多这样的libs =>没有剩余空间。
到目前为止,mathwork的唯一解决方法是首先加载重要的(!)libs(他们build议把“ones(10)* ones(10)”放在startup.m中)。 我最好不要评论这个“解决策略”。
由于R2013b(8.2.0.701)与Linux x86_64的经验是:不要使用“doc”(graphics帮助系统)! 我认为这个doc-utility(libxul等)使用了很多静态TLS内存。
这是一个更新(2013/12/31)
以下所有testing均使用Fedora 20(使用glibc-2.18-11.fc20)和Matlab 8.3.0.73043(R2014a预发布)完成。
有关TLS的更多信息,请参阅Ulrich Drepper,ELF处理线程本地存储的版本0.21,2013 ,目前可在Akkadia和Redhat获得 。
究竟发生了什么?
MATLABdynamic地(使用dlopen)加载了几个需要初始化的库。 所有这些库在dtv(dynamic线程向量)中都需要一个槽。 由于MATLAB在运行时在编译/链接时dynamic地加载了这些库中的几个,链接器(在mathworks)没有机会计算所需的槽(这是重要的部分)。 现在dynamiclib加载程序的任务是在运行时处理这种情况。 但这并不容易。 引用dl-open.c:
对于静态TLS,我们必须在这里和现在分配内存。 这包括在DTV中分配内存。 但是除了我们自己以外,我们不能改变任何DTV。 所以,如果我们不能保证在DTV中有空间的话,我们甚至不会尝试它,并且不能承受负担。
在glibc的dynamiclib加载器中有一个编译时间常量(称为DTV_SURPLUS,请参阅glibc-source / sysdeps / generic / ldsodefs.h),用于为这样的混乱预留大量额外的插槽(在multithreading中dynamic加载静态TLS库程序)。 在Fedora 20的glibc-Version中,这个值是14。
这里是第一个需要在我的情况下需要dtv插槽的库(运行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。 这就是错误信息试图告诉我们,特别是math工作。
为了logging:为了不违反MATLAB的许可证,我没有debugging,反编译或反汇编随MATLAB附带的二进制文件的任何部分。 我只debugging了用于dynamic加载库的Fedora 20的免费和开放的glibc二进制文件。
有什么可以做的,解决这个问题?
有3个选项:
(a)重buildMATLAB,不要dynamic加载这些库(使用initial-exec tls模型)而不是链接它们(然后链接器可以计算所需的插槽数)!
(b)重build这些库并确保它们不使用initial-exec tls模型。
(c)在glibc / sysdeps / generic / ldsodefs.h中重buildglibc并增加DTV_SURPLUS
显然选项(a)和(b)只能通过math工作来完成。
对于选项(c),不需要MATLAB的源代码,因此可以在没有math工作的情况下完成。
mathworks的状态是什么?
我真的试图向“MathWorks技术支持部门”解释这一点。 但我的印象是:他们不了解我。 他们closures了我的支持票,并在2014年1月与技术支持经理build议进行电话(!)交谈。
我会尽我所能解释这一点,但说实话:我不是很有信心。
更新(2014/01/10):目前mathworks正在尝试选项(b)。
更新(2014/03/19):对于文件libiomp5.so,您可以在mathworks下载最新编译的版本(不含静态TLS), bug报告961964 。 而其他的库? 那里没有改善。 所以不要惊讶得到“dlopen:无法加载静态TLS的对象”与“文档”,例如见bug报告1003952 。
重新启动Matlab解决了我的问题。
长话短说:在你开始创build一个文件startup.m与内容ones(10)*ones(10);
文件ones(10)*ones(10);
启动matlab的目录ones(10)*ones(10);
。 重新启动matlab,它将被照顾。
http://www.mathworks.de/support/bugreports/961964已于30/01/2014更新。; 有一个zip文件附带libiomp5.so我testing它在Mageia 4 x86_64与Matlab R2013b。 我现在可以使用Matlab的文档来打开一个演示没有任何问题。
我有同样的问题,我想我只是解决了它。
当安装matlab使用自定义安装(我没有这样做的第一次)。 select在预定义文件夹(/ usr / local / bin)中创build符号链接到matlab脚本。 这为我做了诡计!
Matlab 2013b和Matlab 2014a都有同样的问题。 mathworks为libiomp5.so提供的修复程序只消除了LAPACK不起作用的问题。 但是,我无法使用使用OpenMp的外部库(如VL_FEAT):仍然出现“dlopen:无法使用静态TLS加载更多对象”的错误。
唯一的工作是我降级到Matlab 2012b。
正如我所见,这是一个古老的问题,MathWorks尚未解决。
这里是我的两分钱,对我来说(当我需要IT ++外部库,与MEX)。
让你发现的问题库是“libXYZ.so”,并知道它在系统上的位置。
解决scheme是通知MATLAB在其启动之前加载特定的库。 这个错误的原因显然是由于缺乏这个thread local storage
又名tls
目的的插槽(由于它们已经被填满)。
由于最新的编译突然需要一个新的库,它在启动时没有加载,MATLAB抛出了这个错误。
可惜MATLAB从未关心这个问题解决这么久。
幸运的是,解决scheme是一个简单的terminal命令。
linux-machine上的典型步骤如下:
- 打开命令提示符(Ubuntu中的
Ctrl+Alt+T
) - 发出以下命令
导出LD_PRELOAD = <PATH-TO-libxyz.so>
例如: export LD_PRELOAD=/usr/local/lib/libitpp.so
- 从同一个terminal启动matlab
matlab&
现在运行你的程序应该可以解决这个问题,就像我的情况一样。
祝你好运!
参考:
[1] http://au.mathworks.com/matlabcentral/answers/125117-openmp-mex-files-static-tls-problem
我遇到这个问题后,“酒吧”(对于条形图)与一个数组给我一个单一的蓝色块,没有错误抛出。 首先重新启动解决了这个问题。 但是在出现内存错误(在处理一个非常大的文件之后)之后,我无法摆脱这个蓝色块的问题。
在matrixinput中使用“hist”给了我“BLAS加载错误”的问题,并引导我到这个线程。 Mathwork解决方法修复了hist和bar问题。
只是想要认识到这个bug的影响程度。
我有同样的问题,并通过增加我的Java堆内存来解决它。 转至首选项>常规> Java-Heap内存,并增加分配的内存。
在R2013b / Ubuntu 12.04上增加Java堆内存(至512 MB)也适用于我。 当我处理一个11 GB的文件(16 GB RAM)时,“BLAS加载错误”开始,并且在增加java堆内存和重新启动matlab之后没有再次发生。