2017-01-06 6 views
0

私は2つの物理CPUコアを持つマシンで作業しています。 Arii_Modified機能は私によって書かれています。パラレルプールを使用せずに、次のように私は、コードを実行すると、所要時間は425.456これはMATLABで並列プールを使用する本当の方法ですか?

profile on 
[Ps,Pd,Pv,ThetaMean,Variance,frobonius] = Arii2011_Modified(C11,C12_imag,C12_real,C13_imag,C13_real,C22,C23_imag,C23_real,C33); 
profile off 
profsave 
span = C11+C22+C33; 
total=Pd+Ps+Pv+frobonius; 
save('results.mat'); 

である。しかし、次のように私は2人の労働者と並行プールを起動するとき:

parpool('local',2) 
profile on 
[Ps,Pd,Pv,ThetaMean,Variance,frobonius] = Arii2011_Modified(C11,C12_imag,C12_real,C13_imag,C13_real,C22,C23_imag,C23_real,C33); 
profile off 
profsave 
span = C11+C22+C33; 
total=Pd+Ps+Pv+frobonius; 
save('results.mat'); 
p = gcp; 
delete(p) 

かかる時間が687.687であります秒。
私は真の方法で並列プールを使用していますか?
機能Arii2011_modified内のコードは完全にシーケンシャルです。
私はそれを加速するためにMEXのソリューションを使用しましたが、何の並列プログラミングコードはArii2011_Modified.mコードでも、その中のMEX関数のC++ソースでもない使用されていませんか?

答えて

1

parpoolだけで魔法のように並列にちょうど任意のコードの実行をしないと高速に実行。 MATLABインスタンスのプールを作成するだけで、渡されたタスクを処理できるワーカーとなります。あなたは単純に(parpoolを使って)並列プールを作成しましたが、実際にはそれを使用していないので、あなたのコードがより速く実行されることは期待できません。実行時間の増加は、単にプールを開始するのに必要な時間のためです。

あなたが作成し、実際に使用パラレルプールにしたい場合は、parfor内の各反復は独立しており、parforループを介して各反復はなりparfor構文内のコードの一部をラップする必要があります利用可能な労働者の1人に引き渡された。

コードが実際には並列化できない場合は、Arii2011_Modified.mを詳しく見て、実行時間を短縮するためにベクトル化できるかどうかを確認することをお勧めします。

Mathworks社は、MATLAB内並列コンピューティングを活用する方法についていくつかの素晴らしいdocumentationを持っています。それはすべての関数呼び出しを追跡していますので、それはオーバーヘッドのたくさんを紹介するので、サイドノートとして

、あなたが実際に実行時間を測定する場合、profileはそれを行うには悪い方法です。代わりにtimeitを使用してください。

+0

感謝。私のコードは、 'forfor'などを使用する状態ではありません。なぜなら私はC++内の' forループ 'をすべて実装していて、それらはプリコンパイルされているからです。しかし、もう一つの選択肢は、分散配列を使用して、配列全体の一部を各ワーカーに与えて、関数を実行することです。手動でではなく、プログラムでそれをどうすればできますか?出来ますか? – sepideh

+0

@sepidehこれを行うための最善の方法はありません。あなたはそれを自分で実装する必要があります。私が言ったように、MATLABのコードの一部をベクトル化(forループを削除)し、実行時間を比較することを検討する価値があります。 – Suever

+0

これでコードを表示します。もはやmatlab内のコードをベクトル化する方法はありません。本当にこの質問の範囲を超えだと、おそらくこの質問はおよそ特に 'parpool'は、実行時間を減少させなかった理由でしたcodereview.stackexchange.comに適してい – sepideh