0

現在、MATLAB 2012aのparfor関数を使用して実験を並行して実行するために、MATLABでMEXファイルをコーディングしています。MEXファイルは、いくつかの非常に単純な数値タスクを実行しますが、IBMのCPLEX12.4APIに依存しています。

私のMEXファイルは順番に動作しますが、並列で実行すると、必然的に「ランダムな」セグメンテーション違反が発生します。セグメンテーション違反のスタックトレースをMATLABに送信した後、彼らは、エラーがCライブラリの「putenv()」関数に起因することを示唆しました。これは明らかにスレッドセーフではありません。

MEXコードでputenv()関数を使用していませんが、CPLEX12.4から絶対に呼び出さなければならない関数の1つがそれを使用していることがわかりました。この関数の結果として発生するセグメンテーション違反を回避するために何かできることがあるかどうか疑問に思っています。以前、誰かが「ビットをロックする」と「セマフォを使用する」ことを提案しましたが、これらの概念に関しては、私は本当に頭がおかしいです。

アドバイスや指示をいただければ幸いです。

4

1 に答える 1

0

MATLABコードでCPLEXMATLABAPIを使用し、MEXコードでCPLEX C APIを同時に使用しているため、違反が発生していることがわかりました。どちらのAPIも、スレッドセーフではないputenv()関数を使用します。特に、2つのスレッドが同時にputenv()関数を使用しようとすると(MEXファイルまたはMATLABコードのいずれかで)クラッシュが発生します。

修正は、パッケージを使用し、CおよびMATLABのputenv()を使用する関数(つまり、CのCPXopenCPLEX / MATLABのCplex())の周りにmutex_lock/mutex_unlockを追加することです。mutex_lock / mutex_unlockを作成するための詳細情報と正確なコードは、CPLEXフォーラムの次の投稿にあります。

于 2012-04-27T15:30:38.030 に答える