几天以来,我在使用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
我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么做。这些是我找到的主题:
有人能帮助我吗?
>> 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
答案 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内存。
所有以下测试均使用Fedora 20(使用glibc-2.18-11.fc20)和Matlab 8.3.0.73043(R2014a预发布)进行。
有关TLS的详细信息,请参阅 Ulrich Drepper,ELF处理线程局部存储,版本0.21,2013, 目前位于Akkadia和Redhat。
究竟发生了什么?
动态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上的典型步骤应如下:
Ctrl+Alt+T
)export LD_PRELOAD =< PATH-TO-libxyz.so>
例如:export LD_PRELOAD=/usr/local/lib/libitpp.so
matlab&
现在运行程序应解决问题,就像我的情况一样。
祝你好运!参考:
[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后没有重现。