MatLab 错误 : cannot open with static TLS

标签 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

有人可以帮帮我吗?

证明此错误的函数调用示例

>> 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

最佳答案

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

到目前为止,mathwork 唯一的解决方法是通过尽早使用它们来首先加载重要的(!)库(他们建议将“ones(10)*ones(10);”放在 startup.m 中)。我最好不要评论这个“解决策略”。

自 R2013b (8.2.0.701) 和 Linux x86_64 以来,我的经验是:不要使用“doc”(图形帮助系统)!我认为此文档实用程序(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)加载几个需要 tls 初始化的库。所有这些库都需要在 dtv(动态线程向量)中有一个插槽。因为 MATLAB 在编译/链接时在运行时动态加载其中几个库,所以链接器(在 mathworks)没有机会计算所需的插槽(这是重要的部分)。现在动态库加载器的任务是在运行时处理这种情况。但这并不容易。引用 dl-open.c:

For static TLS we have to allocate the memory here and now. This includes allocating memory in the DTV. But we cannot change any DTV other than our own. So, if we cannot guarantee that there is room in the DTV we don't even try it and fail the load.

在 glibc 的动态库加载器中有一个编译时间常量(称为 DTV_SURPLUS,请参阅 glibc-source/sysdeps/generic/ldsodefs.h),用于为这种困惑保留一些额外的插槽(使用静态 TLS 动态加载库)在多线程程序中)。在 Fedora 20 的 glibc 版本中,这个值为 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 中没有剩余插槽。这就是错误消息试图告诉我们的,尤其是 mathworks。

郑重声明:为了不违反 MATLAB 的许可,我没有调试、反编译或反汇编 MATLAB 附带的二进制文件的任何部分。我只调试了 MATLAB 用来动态加载库的 Fedora 20 的免费和开放 glibc 二进制文件。

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

有3个选项:

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

(二) 重建这些库并确保它们没有使用 initial-exec tls 模型。

(三) 重建 glibc 并增加 DTV_SURPLUS in glibc/sysdeps/generic/ldsodefs.h

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

对于选项 (c),不需要 MATLAB 源,因此无需数学即可完成。

ma​​thworks 的状态如何?

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

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

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

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

关于MatLab 错误 : cannot open with static TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19268293/

相关文章:

gcc - 使用 gcc : order of arguments 链接库

c++ - 使用 QT 处理来自 C 程序的数据的 GUI

matlab - 创建一个树桩 Matlab

c - 对 memdup 的 undefined reference

c++ - 否定 std::vector 的最快方法

c - 两个矩阵乘积的SVD的LAPACK例程

macos - 期望 LAPACK 例程在两种不同的处理器架构上获得相同的结果是否合理?

matlab - 如何编写依赖于其他矢量化表达式的矢量化表达式?

matlab - MATLAB 中 Mathematica 的 RegionPlot3D[] 的等价物是什么?

Matlab递减矩阵对角线