matlab に parfor ループがあり、実行中は 1 つのプロセスのみが CPU を使用しており (トップとシステム モニターは同じ CPU 使用率を示しています。添付のスクリーンショットを参照)、parfor はより速く実行されません。どうして???
ubuntu 12.04 LTS、64 ビット matlab 2012b
pools = matlabpool('size');
if pools ~= 10
if pools > 0
matlabpool('close');
end
matlabpool local 10; %10+ the one I am using = 11 matlab process in system monitor
end
parfor i = 1:num_utt
dojob();
end
ありがとう、マルシン&エドリック、
あなたが提案するように小さなテストケースを実行しましたが、このhttp://www.mathworks.com/help/distcomp/advanced-topicsで、内側のループコードが外側のループデータにアクセスすることが問題の原因であることに気付きました。 html、彼らはそれをアクセスブロードキャスト変数と呼んでいます。
parfor ループの開始時に、ブロードキャスト変数の値がすべてのワーカーに送信されます。このタイプの変数は便利で不可欠なものですが、ブロードキャスト変数が大きいと、クライアントとワーカーの間で多くの通信が発生する可能性があります。場合によっては、この目的のために一時変数を使用し、ループ内で一時変数を作成して割り当てる方が効率的かもしれません。
私の場合、ブロードキャスト変数は大量のデータを保持しているため、ワーカーに渡すのに問題があります。
一部のデータを削除すると、parfor ループは正常に機能します。