17

私が扱っているコードには、次のようなループがあります。

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   

小さいnt(10)の場合。

タイミングを合わせた後は、通常のループを使用するよりも実際には100倍遅くなります!!! parforが並列合計を実行できることを知っているので、なぜこれが機能しないのかわかりません。

走る

matlabpool

コードを実行する前に、すぐに使用できる構成を使用します。

私はmatlabに比較的慣れておらず、並列機能を使い始めたばかりなので、愚かなことをしていないと思い込まないでください。

ありがとう!

PS:コードをクアッドコアで実行しているので、いくつかの改善が見られると思います。

4

3 に答える 3

22

の値が小さい場合、結果のパーティション化とグループ化(作業の分割と複数のスレッド/コアからの結果の収集のオーバーヘッド)は高くなりますnt。これは正常なことであり、単純なループですばやく実行できる簡単なタスクのためにデータを分割することはありません。

パーティション分割のオーバーヘッドに見合う、ループ内で常にやりがいのあることを実行してください。これが並列プログラミングの素晴らしい入門書です。

スレッドはスレッドプールから取得されるため、スレッド作成のオーバーヘッドが発生しないようにする必要があります。ただしn、サイズから部分結果マトリックスを作成するbistarには、すべての部分結果を計算してから、これらすべての部分結果を追加(再結合)する必要があります。ストレートループでは、これはインプレースで行われる可能性が高く、割り当ては行われません。

ヘルプの完全なステートメント(以下のリンクに感謝)は次のとおりです。

f、g、およびhを計算する時間が長い場合、nが比較的小さくても、parforは対応するforステートメントよりも大幅に高速になります。

つまり、それらが私が意味するものとまったく同じ意味であることがわかります。小さなn値のオーバーヘッドは、ループで行うことが複雑で時間がかかる場合にのみ、努力する価値があります。

于 2010-07-04T10:22:47.967 に答える
13

Parfor少しオーバーヘッドがあります。したがって、ntが本当に小さい場合、およびループ内の計算が非常に高速に実行される場合(加算など)、parfor解は遅くなります。parforさらに、クアッドコアで実行する場合、速度の向上は1〜3コアでほぼ線形になりますが、4コアを使用する場合は、最後のコアもシステムプロセスを実行する必要があるため、速度の向上は遅くなります。

たとえば、parforに100ミリ秒のオーバーヘッドがあり、ループ内の計算に5ミリ秒かかる場合、速度ゲインが係数1で最大4コアまで線形であると仮定すると(つまり、4コアを使用すると計算が4倍速くなります) 、ntで速度を上げるには、約30である必要がありますparfor(で150ms、forで132ms parfor)。10回の反復のみを実行すると、parfor速度が低下します(50msでfor、112msでparfor)。

1ワーカーと0ワーカーの実行時間を比較することでマシンのオーバーヘッドを計算でき、1〜4ワーカーの実行時間にライナーを適合させることで速度の向上を見積もることができます。そうすれば、いつ使用するのが便利かがわかりますparfor

于 2010-07-04T12:35:27.610 に答える
3

parfor通信オーバーヘッド(他の回答を参照)によるパフォーマンスの低下に加えて、この場合に使用しない別の理由があります。parforこの場合、内で行われることはすべて、組み込みのマルチスレッドを使用します。すべてのワーカーが同じPCで実行されていると仮定すると、1回の呼び出しでプロセッサのすべてのコアがすでに使用されているため、利点はありません。

于 2016-02-06T01:45:01.107 に答える