Han*_*yer 81 matlab blas dlopen lapack libraries
几天以来,我在使用MATLAB时不断收到同样的错误dlopen
.我对MATLAB很新,这就是为什么我不知道该怎么做.谷歌似乎也没有帮助我.当我尝试制作一个特征向量时,我得到了这个:
Error using eig
LAPACK loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
在进行乘法时我也得到了这个:
Error using *
BLAS loading error:
dlopen: cannot load any more object with static TLS
Run Code Online (Sandbox Code Playgroud)
我当然找到了这个问题的解决方案,但我不太懂,也不知道该怎么办.这些是我找到的主题:
有谁可以帮助我吗?
>> 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
Run Code Online (Sandbox Code Playgroud)
use*_*218 104
这是自R2012b(8.0)以来已知的MATLAB 961964的错误.MATLAB使用静态TLS动态加载一些库(线程本地存储,例如参见gcc编译器标志-ftls-model).加载太多这样的库=>没有剩余空间.
到目前为止,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
Run Code Online (Sandbox Code Playgroud)
是的,超过14 =>太多=> dtv中没有剩余的插槽.这就是错误消息试图告诉我们的内容,尤其是数学工作.
为了记录:为了不违反MATLAB的许可证,我没有调试,反编译或反汇编MATLAB附带的二进制文件的任何部分.我只调试了MATLAB用来动态加载libs的Fedora 20的free和open glibc-binaries.
可以做些什么来解决这个问题?
有3种选择:
(a)重建MATLAB并且不动态加载那些库(使用initial-exec tls模型)而是链接它们(然后链接器可以计算所需的插槽!)
(b)重建这些库并确保它们不使用initial-exec tls模型.
(c)重建glibc并增加glibc/sysdeps/generic/ldsodefs.h中的DTV_SURPLUS
显然,选项(a)和(b)只能通过mathworks完成.
对于选项(c),不需要MATLAB源,因此可以在没有mathworks的情况下完成.
mathworks的状态是什么?
我真的试着向"MathWorks技术支持部门"解释这个问题.但我的印象是:他们不了解我.他们关闭了我的支持票,并在2014年1月与技术支持经理建议了电话(!)对话.
我会尽力解释这一点,但说实话:我不是很自信.
更新(2014/01/10):目前mathworks正在尝试选项(b).
更新(2014/03/19):对于文件libiomp5.so,您可以在mathworks下载新编译的版本(无静态TLS),错误报告961964.还有其他的库?没有改善.因此,不要惊讶于"dlopen:无法使用"doc"加载任何带有静态TLS的对象,例如,请参阅错误报告1003952.
在我看来,这是 MathWorks 尚未解决的古老问题。
这是我的两分钱,它对我有用(当我想要带有 MEX 的 IT++ 外部库时)。
让您发现导致问题的库为“libXYZ.so”,并且您知道它在您的系统上的位置。
解决方案是通知 MATLAB 在其最早启动时加载特定库。这样做的原因错误显然是由于缺乏对这种插槽thread local storage
又名tls
目的(因为他们已经满箱)。
因为最新的编译突然需要一个在启动期间没有加载的新库,MATLAB 会抛出这个错误。
遗憾的是 MATLAB 从来没有关心解决这个问题这么久。
幸运的是,解决方案是一个非常简单的终端命令。
在 linux 机器上的典型步骤应该如下:
Ctrl+Alt+T
在 Ubuntu 中)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
小智 3
我有同样的问题,我想我刚刚解决了。
安装 matlab 时使用自定义安装(我第一次没有这样做)。选择在预定义文件夹 (/usr/local/bin) 中创建指向 matlab 脚本的符号链接。这对我有用!