web-dev-qa-db-ja.com

MatLabエラー:静的TLSで開くことができません

数日以来、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
77
Hans Meyer

それは バグ番号961964 R2012b(8.0)以降に知られているMATLABの。 MATLABは、静的TLSを使用して一部のライブラリを動的にロードします(スレッドローカルストレージ。gccコンパイラフラグ-ftls-modelを参照)。そのようなライブラリのロードが多すぎる=>スペースが残っていません。

これまでmathworkの唯一の回避策は、重要な(!)ライブラリを早い段階で使用して最初にロードすることです(startup.mに「ones(10)* ones(10);」を入れることを推奨します)。この「ソリューション戦略」についてはコメントしないほうがいいでしょう。

Linux x86_64でのR2013b(8.2.0.701)以降、私の経験は次のとおりです。「doc」(グラフィカルヘルプシステム)を使用しないでください。このdoc-utility(libxulなど)は多くの静的TLSメモリを使用していると思います。

アップデートはこちら(2013/12/31)

以下のすべてのテストは、Fedora 20(glibc-2.18-11.fc20)およびMatlab 8.3.0.73043(R2014a Prerelease)で行われました。

TLSの詳細については、Ulrich Drepper、スレッドローカルストレージのELF処理、バージョン0.21、2013、現在 Akkadia および Redhat で入手可能を参照してください。

何が正確に起こりますか?

MATLABは(dlopenを使用して)tlsの初期化を必要とするいくつかのライブラリを動的に読み込みます。これらのライブラリにはすべて、dtv(動的スレッドベクトル)にスロットが必要です。 MATLABはコンパイル/リンク時に実行時にこれらのライブラリのいくつかを動的にロードするため、(mathworksの)リンカーは必要なスロットをカウントする機会がありませんでした(重要な部分です)。現在、実行時にこのようなケースを処理するのは、動的ライブラリローダーのタスクです。しかし、これは簡単ではありません。 dl-open.cを引用するには:

静的TLSの場合、ここでメモリを割り当てる必要があります。これには、DTVでのメモリの割り当てが含まれます。ただし、当社以外のDTVを変更することはできません。したがって、DTVに空きがあることを保証できない場合は、DTVを試してロードに失敗することもありません。

Glibcの動的libローダーにはコンパイル時定数(DTV_SURPLUSと呼ばれ、glibc-source/sysdeps/generic/ldsodefs.hを参照)があります。プログラム)。 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 。そして、他のライブラリは?改善はありません。したがって、「dlopen:これ以上静的TLSでオブジェクトをロードできません」を「doc」で取得することに驚かないでください。 バグレポート1003952 を参照してください。

104
user2898218

Matlabを再起動することで問題は解決しました。

27
Wok

簡単な説明:matlabを起動するディレクトリに、コンテンツones(10)*ones(10);を含むファイルstartup.mを作成します。 matlabを再起動すると、処理が行われます。

http://www.mathworks.de/support/bugreports/961964 は2014年1月30日に更新されました。 libiomp5.soに添付されたZipファイルがあるので、Mageia 4 x86_64でMatlab R2013bでテストしました。 Matlabのドキュメントを使用して、問題なくデモを開くことができます。

4
user3283472

これは、私が見つけたように、MathWorksによってまだ解決されていない昔からの問題です。

ここに私の2セントがあり、それは私のために働いた(MEXでIT ++外部ライブラリが必要だったとき)。


問題の原因であることがわかったライブラリを「libXYZ.so」とし、システム上のどこにあるかを知っているようにします。

解決策は、特定のライブラリを起動の早い時点でロードするようにMATLABに通知することです。このエラーの理由は、明らかに、このthread local storage aka tlsの目的のためのスロットが不足しているためです(すでに埋められているため)。

最新のコンパイルでは、起動時にロードされなかった新しいライブラリが突然必要になるため、MATLABはこのエラーをスローします。

この問題を長い間解決するためにMATLABが決して気にかけなかったことは残念です。

幸いなことに、解決策は単一の非常に単純な端末コマンドです。


Linux-machineでの一般的な手順は次のとおりです。

  1. コマンドプロンプトを開く(UbuntuではCtrl+Alt+T
  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

4

私は同じ問題を抱えていたので、解決したと思います。

Matlabをインストールするときは、カスタムインストールを使用します(これは初めて行いませんでした)。事前定義フォルダー(/ usr/local/bin)内のmatlabスクリプトへのシンボリックリンクの作成を選択します。これは私のためにトリックをしました!

3
Anna

Matlab 2013bとMatlab 2014aの両方で同じ問題が発生しました。 mathworksがlibiomp5.soに提供する修正により、LAPACKが機能しないという問題のみが削除されました。ただし、OpenMp(VL_FEATなど)を使用している外部ライブラリを使用できませんでした。「dlopen:これ以上静的TLSでオブジェクトをロードできません」というエラーが表示されます。

私のために働いた唯一のことは、Matlab 2012bにダウングレードすることでした。

3
Jasper Uijlings

この問題に遭遇したのは、配列を使用した「バー」(バープロット用)によって、エラーがスローされることなく青いブロックが1つだけ表示されたためです。最初に再起動して問題を解決しました。しかし、メモリエラーの後(非常に大きなファイルを処理した後)、この青いブロックの問題を乗り越えることはできません。

行列入力で「hist」を使用すると、「BLAS loading error」問題が発生し、このスレッドに至りました。 Mathworkの回避策により、履歴とバーの問題が修正されました。

このバグの影響の範囲で認識をもたらしたかっただけです。

2
Asy

R2013b/Ubuntu 12.04では、Javaヒープメモリの増加(512 MBまで)も機能しました。 「BLAS読み込みエラー」は、11 GBファイル(16 GB RAM)を処理したときに始まり、Javaヒープメモリを増やしてmatlabを再起動した後は再発しません。

0
Michael Knight

同じ問題があり、Javaヒープメモリを増やすことで解決しました。 [設定]> [全般]> [Javaヒープメモリ]に移動し、割り当てられたメモリを増やします。

0
Justin