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


82

几天以来,我在使用MATLAB时不断收到相同的错误,该错误有时在发生dlopen。我对MATLAB很陌生,这就是为什么我不知道该怎么做的原因。Google似乎也没有帮助我。当我尝试制作特征向量时,得到以下信息:

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. 如何使用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

您使用什么操作系统?可以共享一些源代码吗?
ztik

谢谢您的回答。我正在使用ubuntu,例如,请参见上面的示例
Hans Meyer

Answers:


105

自R2012b(8.0)以来,已知的MATLAB的bug并非961964。MATLAB动态加载带有静态TLS(线程本地存储,例如,参见gcc编译器标志-ftls-model)的某些库。加载太多这样的库=>没有空间了。

到目前为止,数学工作的唯一解决方法是先及早使用重要的(!)库(建议将“ ones(10)* ones(10);”放在startup.m中)。我最好不要对此“解决方案策略”发表评论。

从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)加载了一些需要tls初始化的库。所有这些库都需要在dtv(动态线程向量)中添加一个插槽。由于MATLAB在编译/链接时会在运行时动态加载其中一些库,因此链接器(在MathWorks上)没有机会计算所需的插槽(这是重要的部分)。现在,动态库加载器的任务是在运行时处理这种情况。但这并不容易。引用dl-open.c:

对于静态TLS,我们必须在此处和现在分配内存。这包括在DTV中分配内存。但是我们不能改变自己以外的任何数字电视。因此,如果我们不能保证DTV中有空间,我们甚至不会尝试并导致负载失败。

glibc的动态lib加载程序中有一个编译时间常数(称为DTV_SURPLUS,请参见glibc-source / sysdeps / generic / ldsodefs.h),用于为此类混乱情况保留许多其他插槽(在多线程中动态加载具有静态TLS的libs)程序)。在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个选项:

(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。还有其他的库?那里没有改善。因此,不要惊讶地使用“ doc”获取“ dlopen:无法使用静态TLS加载更多对象”,例如,参见错误报告1003952


我可以确认这一点,在我的Fedora 64位开放文档中,加载BLAS时会导致错误。即使将Java堆内存增加到1Gb(我认为足够了)之后,同样的事情也会发生。
MeloMCR

我可以在openSUSE 13.1(64位)和MATLAB R2013b上确认此问题,请参见此处:mathworks.com/matlabcentral/newsreader/view_thread/332791。到目前为止,没有可行的解决方案!!!
michal,2013年

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

我自己的mex文件(与gfortran编译)出现此错误。我有什么办法可以以不同的方式构建它们以避免此问题?这些标志包括-fPIC,文档说应该使用-fPIC而不是initial-exec TLS。
robince 2014年

我在Ubuntu 12.04 64bit上确认了此问题。并用错误报告中的库替换了库,从而解决了该问题。+1
NKN 2014年

27

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


我已经看到类似的行为。第一次启动后,matlab发出上述错误消息。重新启动后,该错误不会再次出现。在第二次重新启动后,该错误确实再次出现,并且可以一遍又一遍地重复进行。在Matlab的第一次,第三次,第五次开始之后,它会间歇性地重新出现。
Christoph

1
对我来说,它也解决了我的问题。但是感谢user2898218分享了所有这些内容。
desmond13年

使用Matlab R2016b在OpenSuse Leap 42.1上对我不起作用
Sameer

6

长话短说:在启动matlab的目录中,创建一个带有content的文件startup.m ones(10)*ones(10);。重新启动matlab,它将得到解决。


对我来说很好!谢谢!
user2230101

5

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

这是我的两分钱,为我工作(当我想要IT +外部库和MEX时)。


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

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

由于最新的编译突然需要一个新的库,而该库在启动时并未较早加载,因此MATLAB抛出此错误。

可惜的是,MATLAB这么久以来都不愿解决这个问题。

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


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

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

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


对于我来说,这是一个完全不同的解决方法:issue.dlang.org/show_bug.cgi?id=17061
timotheecour

谢谢!唯一对我有用的解决方案(也是最简单的一种)。我正在使用一些没有源代码的外部库。最有趣的是,问题仍然存在于Matlab 2016b中……
foxfireee

4

http://www.mathworks.de/support/bugreports/961964已于2014年1月30日更新。libiomp5附带有一个zip文件。因此,我使用Matlab R2013b在Mageia 4 x86_64上对其进行了测试。现在,我可以使用Matlab文档打开演示文件,而不会出现任何问题。


1
请同时发布解决方案,因为链接可能随时变为不活动状态。
Lakshmi 2014年

解决方案是MathWorks许可的一个文件主题。我们无法重新分发它,而是他们自己构建的,因此没有办法“发布解决方案”。除此之外,它对我不起作用:应该对R2014b进行修复,但仍然会出现错误。
飞羊

3

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

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


这会创建什么链接?我手动链接了所有没有.sh扩展名的脚本,该错误仍然存​​在。
飞羊

3

Matlab 2013b和Matlab 2014a都遇到相同的问题。mathworks为libiomp5.so提供的修复程序仅解决了LAPACK无法正常工作的问题。但是,我无法使用使用OpenMp的外部库(例如VL_FEAT):我仍然收到错误消息“ dlopen:无法使用静态TLS加载更多对象”。

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


在Matlab 2014a中加载libmwosgserver.so时遇到同样的问题。但是当我降级到Matlab 2013b时工作了。
Temak

2

我遇到了一个带有数组的“条形图”(用于条形图)给我一个单一的蓝色块,没有引发错误的问题。首先重新启动即可解决问题。但是在发生内存错误(处理了一个非常大的文件之后)之后,我只是无法克服这个蓝块问题。

在矩阵输入上使用“ hist”会给我“ BLAS加载错误”的问题,并导致我进入该线程。Mathwork解决方法修复了历史记录和小节问题。

只是想使人们认识到此错误的影响。


0

我遇到了同样的问题,并通过增加Java堆内存来解决。转到“首选项”>“常规”>“ Java堆内存”,然后增加分配的内存。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.