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


82

数日後、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. 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

どのOSを使用していますか?ソースコードを共有できますか?
ztik 2013年

ご回答ありがとうございます。私はubuntuを使用しています。例については、上記を参照してください
Hans Meyer

回答:


105

それはバグ番号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プレリリース)を使用して実行されました。

TLSの詳細については、Ulrich Drepper、ELF処理For Thread-Local Storage、バージョン0.21、2013を参照してください。現在、AkkadiaRedhatで入手できます。

正確にはどうなりますか?

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

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

glibcの動的libローダーにはコンパイル時定数(DTV_SURPLUSと呼ばれます。glibc-source/ sysdeps / generic / ldsodefs.hを参照)があり、そのような混乱のために多数の追加スロットを予約します(マルチスレッドで静的TLSを使用してlibを動的にロードします)プログラム)。glibc-バージョンのFedora20では、この値は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がライブラリを動的にロードするために使用していたFedora20の無料で開いているglibcバイナリのみをデバッグしました。

この問題を解決するために何ができるでしょうか?

3つのオプションがあります:

(a)MATLABを再構築し、それらのライブラリを動的にロードせず(initial-exec tlsモデルを使用)、代わりにそれらに対してリンクします(その後、リンカーは必要なスロットをカウントできます!)

(b)これらのライブラリを再構築し、initial-exectlsモデルを使用していないことを確認します。

(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のバグレポート961964で新しくコンパイルされたバージョン(静的TLSなし)をダウンロードできます。そして他のライブラリ?そこには改善はありません。したがって、「dlopen:静的TLSでこれ以上オブジェクトをロードできません」を「doc」で取得することに驚かないでください。たとえば、バグレポート1003952を参照してください。


これを確認できます。Fedora64ビットでドキュメントを開くと、BLASのロード時にエラーが発生します。Javaヒープメモリを1Gbに増やした後でも(私が思うに十分です)、同じことが起こります。
MeloMCR 2013年

私はopenSUSEの13.1(64ビット)とMATLAB R2013bでこの問題を確認することができ、ここを参照してください:mathworks.com/matlabcentral/newsreader/view_thread/332791を。これまでのところ、実行可能な解決策はありません!!!
michal 2013年

11
ones(10)* ones(10)をありがとう。startup.mファイル内:今のところ私の問題は解決しました。ところで、このバグは単純に信じられないほどです...
Danduk82 2014年

自分のmexファイル(gfortranでコンパイル)でこのエラーが発生します。この問題を回避するために別の方法でビルドする方法はありますか?フラグには-fPICが含まれており、ドキュメントでは、initial-execTLSではなくglobal-dynamicを使用する必要があるとされています。
ロビンス2014

Ubuntu 12.0464ビットでこの問題を確認します。また、ライブラリをバグレポートのライブラリに置き換えると、問題が解決しました。+1
NKN 2014

27

Matlabを再起動すると、問題が解決しました。


私は同様の行動を見てきました。最初の起動後、matlabは上記のエラーメッセージを出力します。再起動後、エラーは再発しません。エラー2回目の再起動後に再び表示され、これは何度も繰り返すことができます。matlabの1回目、3回目、5回目、...の開始後に断続的に再表示されます。
クリストフ

1
私にとってもそれは私の問題を解決しました。しかし、それをすべて共有してくれたuser2898218に感謝します。
desmond13 2015

MatlabのR2016bでのopenSUSE 42.1リープ上の私のために動作しませんでした
サミール

6

短編小説:matlabを開始するディレクトリに、コンテンツを含むstartup.mファイルを作成します。 ones(10)*ones(10);。matlabを再起動すると、処理されます。


私にとってはうまくいきます!! ありがとう!
user2230101 2015

5

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

これが私の2セントです(MEXを使用してIT ++外部ライブラリが必要な場合)。


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

解決策は、MATLABに、起動の最も早い段階で特定のライブラリをロードするように通知することです。このエラーの理由は、このthread local storage別名のtls目的のためのスロットが不足しているためと思われます(すでにいっぱいになっているため)。

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

MATLABがこの問題を長い間解決することを気にかけなかったことを残念に思います。

幸いなことに、解決策は単一の非常に単純なターミナルコマンドです。


Linuxマシンでの一般的な手順は次のとおりです。

  1. コマンドプロンプトを開く(Ctrl+Alt+TUbuntuの場合)
  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


これは、まったく異なる設定での回避策でした:issues.dlang.org/show_bug.cgi
id =

ありがとう!私のために働いた唯一の解決策(そして最も単純なもの)。ソースコードなしでいくつかの外部ライブラリを使用しています。おかしな事は問題はまだ... Matlabの2016Bに存在している
foxfireee

4

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


1
リンクがいつでも非アクティブになる可能性があるため、plsはソリューションを投稿します。
ラクシュミ

解決策は、MathWorksのライセンスの対象となるファイルです。再配布することはできず、彼らが自分で作成したため、「ソリューションを投稿」する方法はありません。それ以外は、私には機能しません。R2014bで修正する必要がありますが、それでもエラーが発生します。
空飛ぶ羊

3

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

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


これはどのようなリンクを作成しますか?.sh拡張子のないすべてのスクリプトを手動でリンクしましたが、バグはまだ存在しています。
空飛ぶ羊

3

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

私のために働いた唯一のことは、Matlab2012bへのダウングレードでした。


Matlab2014aでのlibmwosgserver.soの読み込みでも同じ問題が発生します。しかし、Matlab2013bにダウングレードしたときに機能しました。
Temak 2015年

2

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

マトリックス入力で「hist」を使用すると、「BLASローディングエラー」の問題が発生し、このスレッドにつながりました。Mathworkの回避策は、履歴とバーの問題を修正しました。

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


0

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


0

Javaヒープメモリを(512 mbに)増やすことも、R2013b / Ubuntu12.04で機能しました。「BLAS読み込みエラー」は、11 GBのファイル(16 GBのRAMを使用)を処理したときに発生し、Javaヒープメモリを増やしてmatlabを再起動しても再発しませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.