MatLab错误:无法打开静态TLS

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)

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

  1. 如何使用MATLAB提供的BLAS库?
  2. 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
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内存.

这是更新(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
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.

  • 谢谢你们(10)*(10); 在startup.m文件中:它暂时解决了我的问题.顺便说一句,这个bug简直令人难以置信...... (11认同)

Wok*_*Wok 27

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

  • 对我来说也解决了我的问题。但感谢 user2898218 分享所有这些。 (2认同)

Mor*_*Nia 6

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


Lov*_*ity 5

在我看来,这是 MathWorks 尚未解决的古老问题。

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


让您发现导致问题的库为“libXYZ.so”,并且您知道它在您的系统上的位置。

解决方案是通知 MATLAB 在其最早启动时加载特定库。这样做的原因错误显然是由于缺乏对这种插槽thread local storage又名tls目的(因为他们已经满箱)。

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

遗憾的是 MATLAB 从来没有关心解决这个问题这么久。

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


在 linux 机器上的典型步骤应该如下:

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

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

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

  1. 从同一个终端启动matlab

    MATLAB &

现在运行你的程序应该可以解决这个问题,就像我的情况一样。

祝你好运!


参考:

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


小智 3

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

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