MatLab 错误:无法使用静态 TLS 打开

Posted

技术标签:

【中文标题】MatLab 错误:无法使用静态 TLS 打开【英文标题】:MatLab error: cannot open with static TLS 【发布时间】:2013-10-16 14:11:42 【问题描述】:

几天以来,我在使用 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

我当然确实在寻找这个问题的解决方案,但是我不太了解,也不知道该怎么办。这些是我找到的线程:

    How do I use the BLAS library provided by MATLAB? 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

【问题讨论】:

你用什么操作系统?可以分享一些源代码吗? 感谢您的回答。我用的是ubuntu,例子见上 【参考方案1】:

我发现这是一个古老的问题,但 MathWorks 尚未解决。

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


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

解决方案是通知 MATLAB 在其启动最早的时候加载特定的库。此错误的原因显然是由于缺少此 thread local storage aka tls 目的的插槽(由于它们已经被填满)。

由于最新的编译突然需要一个在其启动期间未加载的新库,MATLAB 抛出此错误。

很遗憾 MATLAB 这么久都没关心解决这个问题。

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


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

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

    导出 LD_PRELOAD=

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

    从同一终端启动 matlab

    matlab &

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

祝你好运!


参考:

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

【讨论】:

这对我来说是一个完全不同的解决方法:issues.dlang.org/show_bug.cgi?id=17061 谢谢!唯一对我有用的解决方案(也是最简单的解决方案)。我正在使用一些没有源代码的外部库。最搞笑的是,Matlab 2016b 中依然存在这个问题……【参考方案2】:

长话短说:在您启动 matlab 的目录中创建一个文件 内容为ones(10)*ones(10); 的startup.m。重启matlab就好了。

【讨论】:

对我来说很好用!!谢谢!【参考方案3】:

在 R2013b/Ubuntu 12.04 上增加 Java 堆内存(至 512 mb)也对我有用。 “BLAS 加载错误”在我处理 11 GB 文件(使用 16 GB RAM)时开始,并且在增加 java 堆内存并重新启动 matlab 后没有再次出现。

【讨论】:

【参考方案4】:

在带有数组的“条形图”(用于条形图)给我一个蓝色块后,我遇到了这个问题,没有抛出任何错误。重启首先解决了问题。但是在内存错误(处理一个非常大的文件之后)之后,我无法解决这个蓝块问题。

在矩阵输入上使用“hist”会给我带来“BLAS 加载错误”问题,并导致我进入这个线程。 Mathwork 解决方法修复了 hist 和 bar 问题。

只是想在这个错误的影响范围内引起人们的认可。

【讨论】:

【参考方案5】:

我在使用 Matlab 2013b 和 Matlab 2014a 时遇到了同样的问题。 mathworks 为 libiomp5.so 提供的修复仅消除了 LAPACK 无法正常工作的问题。但是,我无法使用正在使用 OpenMp 的外部库(例如 VL_FEAT):我仍然收到错误消息 “dlopen: 无法再加载任何带有静态 TLS 的对象。”

唯一对我有用的是降级到 Matlab 2012b。

【讨论】:

在 Matlab 2014a 中加载 libmwosgserver.so 时遇到同样的问题。但是当我降级到 Matlab 2013b 时工作。【参考方案6】:

这是自 R2012b (8.0) 以来已知的 MATLAB 的 bug no 961964。 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, 目前可在Akkadia 和Redhat 获得。

究竟发生了什么?

MATLAB 动态(使用 dlopen)加载几个需要 tls 初始化的库。所有这些库都需要 dtv(动态线程向量)中的一个插槽。因为 MATLAB 在编译/链接时在运行时动态加载其中几个库,所以链接器(在 mathworks 中)没有机会计算所需的插槽(这是重要的部分)。现在动态库加载器的任务是在运行时处理这种情况。但这并不容易。引用 dl-open.c:

对于静态 TLS,我们必须在这里分配内存并且 现在。这包括在 DTV 中分配内存。但我们 不能改变我们自己以外的任何 DTV。所以,如果我们 不能保证我们没有的 DTV 有空间 甚至尝试并失败加载。

在 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 模型)而不是链接它们(然后是链接器 可以计算所需的插槽!)

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

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

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

对于选项 (c),不需要 MATLAB 的源代码,因此可以在没有 mathworks 的情况下完成。

在 mathworks 的状态如何?

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

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

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

更新 (2014/03/19):对于文件 libiomp5.so,您可以在 mathworksbug report 961964 下载新编译的版本(没有静态 TLS)。和其他库?那里没有改善。所以不要惊讶于“dlopen: cannot load any more object with static TLS” with “doc”,例如见bug report 1003952。

【讨论】:

我可以确认这一点,在我的 Fedora 64 位打开文档中加载 BLAS 时会导致错误。即使将 Java 堆内存增加到 1Gb(我认为已经足够了),同样的事情也会发生。 我可以在 openSUSE 13.1(64 位)和 MATLAB R2013b 上确认这个问题,见这里:mathworks.com/matlabcentral/newsreader/view_thread/332791。到目前为止,还没有可行的解决方案!!! 感谢那些(10)*ones(10);在 startup.m 文件中:它暂时解决了我的问题。顺便说一句,这个错误简直令人难以置信...... 我自己的 mex 文件(用 gfortran 编译)遇到了这个错误。有什么办法可以不同地构建它们来避免这个问题吗?标志包括 -fPIC 文档说应该使用 global-dynamic 而不是 initial-exec TLS。 我在 Ubuntu 12.04 64bit 上确认了这个问题。并用错误报告中的库替换库解决了问题。 +1【参考方案7】:

http://www.mathworks.de/support/bugreports/961964 已于 2014 年 1 月 30 日更新。 libiomp5.so 附带一个 zip 文件 我使用 Matlab R2013b 在 Mageia 4 x86_64 上对其进行了测试。 我现在可以毫无问题地使用 Matlab 的文档打开演示。

【讨论】:

请发布解决方案,因为链接可能随时变为非活动状态。 解决方案是受 MathWorks 许可的文件。我们不能重新分发它,他们自己构建了它,所以没有办法“发布解决方案”。除此之外,它对我不起作用:它应该为 R2014b 修复,但我仍然收到错误。【参考方案8】:

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

【讨论】:

我见过类似的行为。首次启动后,matlab 会发出上述错误消息。重新启动后,错误不再出现。错误确实在第二次重新启动后再次出现,并且可以一遍又一遍地重复。它在matlab的第一次,第三次,第五次,...开始后间歇性地重新出现。 对我来说也解决了我的问题。但感谢 user2898218 分享所有这些。 在使用 Matlab R2016b 的 OpenSuse Leap 42.1 上对我不起作用【参考方案9】:

我遇到了同样的问题,并通过增加我的 Java 堆内存来解决它。转到 Preferences > General > Java-Heap Memory,并增加分配的内存。

【讨论】:

【参考方案10】:

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

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

【讨论】:

这会创建哪些链接?我在那里手动链接了所有没有 .sh 扩展名的脚本,并且该错误仍然存​​在。

以上是关于MatLab 错误:无法使用静态 TLS 打开的主要内容,如果未能解决你的问题,请参考以下文章

dlopen:无法使用静态 TLS 加载更多对象

torch/lib/libgomp-d22c30c5.so.1:无法在静态 TLS 块中分配内存

OSError:/lib/aarch64-linux-gnu/libgomp.so.1:无法在静态 TLS 块中分配内存

Python Flask 应用程序中的“无法在静态 TLS 块中分配内存”

Windows 7 中的错误:请求被中止:无法创建 SSL/TLS 安全通道

ImportError:/usr/lib/aarch64-linux-gnu/libgomp.so.1:无法在静态 TLS 块中分配内存