5

VC++ で multitprocess アプリケーションを作成し、systemMATLAB のコマンドでコマンド ライン引数を指定して実行しようとしました。実行されますが、1 つのコアでのみ --- 何か提案はありますか?

更新:実際には、2 番目のコアも表示されません。私は OpenMP を使用し、and を使用omp_get_max_threads()omp_get_thread_num()てチェックし、MATLAB からアプリケーションを実行したときのomp_get_max_threads()ようですが、コマンド ウィンドウから実行した場合は (予想どおり) です。12

質問:私のタスク マネージャは、CPU 使用率が 100% に近いと報告しています --- これは、前述の API が誤動作していて、まだマルチプロセス アプリケーションとして実行されていることを意味しますか?

確認:

Process Explorerを使用して、スレッド数に違いがあるかどうかを確認しました。

コマンドウィンドウからアプリケーションを呼び出すと、1スレッドがアプリケーションcmd.exe2行き来します。

MATLAB から呼び出すと、26スレッドは for MATLAB.exe1for cmd.exe、および1for のアプリケーションです。

何か案は?

4

3 に答える 3

7

問題は、別のプロセスであるため、Matlab がアプリの動作にどのように影響するかです。Matlab が OMP に影響を与える方法で環境変数を変更していると思われます。おそらく、内部で OMP を使用しており、Matlab から生成されたプロセスがこの変更された環境を継承しているためです。

アプリをプレーンで起動しているコマンド ウィンドウから "set > plain.txt" を実行し、Matlab 内から "system('set > from_matlab.txt')" を実行して、出力を比較します。これにより、Matlab が導入している環境変数の違いが表示されます。これを行うと、これは Matlab から継承された環境に表示されますが、プレーン コマンド ウィンドウの環境には表示されません。

OMP_NUM_THREADS=1 

ご質問の関数呼び出しに関連する OpenMP 設定のようです。生成されたアプリはそれを見て、それを尊重していると思います。

なぜMatlabがそれを設定しているのかわかりません。ただし、回避策として、Matlab からアプリを起動するときに、アプリを直接呼び出すのではなく、OMP_NUM_THREADS 環境変数をクリアするか、より高い数値に設定するラッパー .bat ファイルを呼び出します。

于 2010-04-13T18:45:38.200 に答える
1

Matlab の外部でコマンドを実行し、使用しているコアの数を確認します。オペレーティング システムへの単なる呼び出しであるため、Matlab 内から実行することに違いはありません。すなわち。コマンドラインでの実行と同等です。

編集

奇妙なことに、電話すると何が得られますfeature('NumCores')か? どのバージョンの Matlab を使用していますか?

これを有効にすると役に立ちますか?

imgur.comが主催

于 2010-04-13T00:16:55.697 に答える
0

MATLAB コマンドラインで実行する必要があります。

setenv OMP_NUM_THREADS 4

4 つのスレッドを使用する場合。

于 2010-04-28T09:15:02.883 に答える