Matlab Parforはより遅いです - 何が悪いのですか?
-
02-10-2019 - |
質問
私が扱っているコードには、次のようなループがあります。
bistar = zeros(numdims,numcases);
parfor hh=1:nt
bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ;
end
小さなNT(10)の場合。
タイミングを合わせた後、実際にはそうです 100倍遅い 通常のループを使用するよりも!!! Parforは並行合計を行うことができることを知っているので、なぜこれが機能していないのかわかりません。
走る
matlabpool
コードを実行する前に、すぐにボックスの構成を使用してください。
私はMatlabに比較的慣れていないので、並列機能を使用し始めたばかりなので、愚かなことをしていないと思い込まないでください。
ありがとう!
PS:Quad Coreでコードを実行しているので、いくつかの改善が見られると予想されます。
解決
結果をパーティション化してグループ化する(作業を分割する際のオーバーヘッドといくつかのスレッド/コアから結果を収集する)は、わずかな値の場合が高いです nt
. 。これは正常です。簡単なループで迅速に実行できる簡単なタスクのためにデータを分割することはありません。
オーバーヘッドをパーティション化する価値のあるループ内で挑戦的な何かを常に実行してください。これがいいです 並列プログラミングの紹介.
スレッドはスレッドプールから来ているので、スレッドの作成のオーバーヘッドはそこにないはずです。しかし、部分的な結果を作成するため n
からのマトリックス bistar
サイズを作成する必要があり、すべての部分的な結果を計算し、これらすべての部分的な結果を追加する必要があります(再結合)。ストレートループでは、これは高い確率で行われる可能性が高く、割り当ては行われません。
ヘルプの完全な声明(以下のリンクをありがとう)は次のとおりです。
f、g、およびhが大きい場合の時間が大きい場合, 、Parforは、たとえNが比較的小さい場合でも、対応するステートメントよりも大幅に高速になります。
したがって、それらは私が言っていることとまったく同じことを意味します。小さなN値のオーバーヘッドは、ループで行うことが複雑/時間がかかる場合にのみ努力する価値があります。
他のヒント
Parfor
少し頭上が付属しています。したがって、場合 nt
本当に小さく、ループ内の計算が非常に迅速に実行された場合(追加のように)、 parfor
解決策は遅くなります。さらに、実行する場合 parfor
クアッドコアでは、1-3コアでは速度ゲインが線形に近くなりますが、最後のコアもシステムプロセスを実行する必要があるため、4つのコアを使用する場合は少なくなります。
たとえば、Parforに100msのオーバーヘッドが搭載されており、ループ内の計算に5msがかかり、速度ゲインが1の係数を持つ最大4コアの線形であると仮定した場合(つまり、4コアを使用すると、計算が4倍高速になります) 、 nt
あなたがスピードゲインを達成するためには約30である必要があります parfor
(150ms for
, 、132ms parfor
)。 10回の反復だけを実行する場合、 parfor
遅くなります(50ms for
, 、112ms parfor
).
実行時間を1人の労働者と0労働者と比較することで、マシンのオーバーヘッドを計算できます。また、1〜4人のワーカーで実行時間を介してライナーをフィットさせることで速度ゲインを推定できます。次に、使用するといつ役に立つかがわかります parfor
.
通信オーバーヘッドのためにパフォーマンスが悪いことに加えて(他の回答を参照)、使用しない別の理由があります parfor
この場合。内部で行われるすべて parfor
この場合、使用します 組み込みマルチスレッド. 。すべての労働者が同じPCで実行されていると仮定すると、単一の呼び出しはすでにプロセッサのすべてのコアを使用しているため、利点はありません。