0

私は大きな問題に直面しています。Matlab エンジン (engOpen() など) を使用して呼び出す埋め込みの Matlab 関数を含む複雑な C アプリケーションを構築しました。次のことが起こります。

  • このアプリケーションの複数のインスタンスを、各コアに 1 つずつ、マシン上で生成します
  • でも!... その後、アプリケーションの速度が低下して停止します。実際、私の 16 コア マシンでは、アプリケーションの速度が約 16 分の 1 に低下します。
  • これは、マシンごとに開始された matlab エンジンが 1 つしかなく、16 個のインスタンスすべてが同じ matlab のコピーを共有しているためであることに気付きました。
  • これをmatlab GUIで再現しようとしましたが、同じ問題です。GUI で 14 秒かかるプログラムを実行し、2 つの GUI で同時に実行すると 28 秒かかります

これは私にとって大きな問題です。なぜなら、matlab を使用せずに C アプリケーション全体を再プログラムしなければならない場合、締め切りに間に合わないからです。matlab には並列プログラミング用のコマンドがあることは知っていますが、私の matlab 呼び出しは C アプリケーションに埋め込まれており、C アプリケーションの複数のインスタンスを実行したいと考えています。繰り返しになりますが、締め切りに間に合わないため、C アプリケーション全体をリファクタリングすることはできません。

これに対する解決策があるかどうか誰でも教えてください (たとえば、同じマシンで複数の matlab プロセスを実際に開始するなど)。追加のライセンスの料金を支払うつもりです。現在、すべてのマシンに完全にライセンスされた matlab がインストールされています。

どうもありがとうございました!

編集

Ben Voigt さん、ご協力ありがとうございます。Matlab の 1 つのインスタンスが既に複数のコアを使用していることがわかりました。実際、1 つのインスタンスを実行すると、4 つのコアが完全に使用されていることがわかります。Matlab の 2 つのコピーを実行すると、8 コアをフルに活用できます。したがって、実際には並行して実行されます。ただし、2 つのインスタンスが 2 倍の処理能力を使用しているように見えますが、それでも 2* の速度低下が発生します。したがって、2 つのインスタンスは 2 倍の結果を得て、計算能力の合計は 4 倍になるようです。それはなぜでしょうか?

4

2 に答える 2

1

スローダウンの原因は、N 個のインスタンスすべてを単一のコア上の単一の MatLab インスタンスに詰め込むことではなく、各インスタンスが自由に使える 16 個のコアがなくなったことです。多くの MATLAB ベクトル演算は、明示的な並列構造がなくても並列計算を使用するため、最適な効率を得るにはインスタンスごとに複数のコアが必要です。

于 2014-02-16T18:39:29.130 に答える
0

MATLAB ライブラリはスレッドセーフではありません。マルチスレッド アプリケーションを作成する場合は、1 つのスレッドのみがエンジン アプリケーションにアクセスするようにしてください。

matlab エンジンは間違った手法だと思います。Windows プラットフォームの場合、com オートメーション サーバーの使用を試すことができます。このサーバーには、.Single開いた com クライアントごとに 1 つの matlab インスタンスを開始するオプションがあります。

代替手段は次のとおりです。

  • 関数の C++ コードを生成します。
  • .NET ライブラリを作成します。(NEビルダー)
  • コマンド ラインから matlab を実行します。
于 2014-02-16T17:55:29.393 に答える