2

2 つの Matlab 関数を並行して実行する必要があります。問題は、それらからの結果の取得が実行よりもはるかに遅いことです。

最初の方法:

spmd;
 if labindex==1, 
  K=MatricaK(NP, NE, r, Kxx, N, h, 1); %K is 1000x1000 matrix
 end;
 if labindex==2,
  F=Apkrovos(NP, NE, N, r, Ta, h, 1); %F is 1000x1 vector
 end;
end;
%This part is quite fast, around 0.17s.
K=K{1};
F=F{2};
%This part is very slow, around 1.15s.

2 番目の方法:

parfor i=1:2
 if i==1
  K=MatricaK(NP, NE, r, Kxx, N, h, 1); %this way doesn't return K outside the loop, but very fast, around 0.15 for all loop
 ..
  K{i}=MatricaK(NP, NE, r, Kxx, N, h, 1); %this works, but slow, around 1.5s
 ..
  K = [K MatricaK(NP, NE, r, Kxx, N, h, 1)]; %also works, but slow, around 1.5s
 ...
end;

結果を速く返すにはどうすればよいですか? 同時に 3 つの異なる関数を実行する MATLAB の並列プログラミングを見つけましたが、速度については何もありません。

4

1 に答える 1

1

したがって、問題は、結果を渡すために発生するオーバーヘッドです。具体的な回答はできませんが、状況と matlab のバージョンによって異なりますが、いくつか試してみることをお勧めします。

  1. matlabpool ラボからデータを取得するさまざまな方法を試してください。それらのいくつかは、matlab が舞台裏で最適化を行うことを許可する場合があります。これについては、分散配列を見ることをお勧めします。または、データに対して後続の処理を行う必要がない場合は、メモリを介して渡すのではなく、直接ディスクに保存することもできます。

  2. 分散バッチ ジョブとして実行してみてください。最近のバージョンの matlab では、バッチ ジョブを作成し、(専用クラスターではなく) ローカル マシンで実行できます。2 つの関数は完全に独立しているため、この方法を使用すると、データをより迅速に取得できます。

  3. 結果を共有メモリに配置する方法を見つけてみてください。これは、Matlab の並列処理がメッセージ パッシングで動作する MPI に基づいているため、困難です。一部のモードは、基本的に MPI 上の matlab ラッパーです。これは、各ワーカーが個別のメモリ空間を持つ Matlab の個別のインスタンスであることを意味します。そのため、データを再度収集すると、実際にはその MPI メッセージが作成され、オーバーヘッドが発生します。これを回避する方法は以前にstackoverflowで議論されました。

  4. 関数の内部を見てみましょう。呼び出している 2 つの関数を変更できる/許可されている場合は、そのような通信オーバーヘッドがない方法でそれらを並列化できる場合があります。ベクトルの並列処理に関しては、Matlab は非常に賢いので、ベクトル/行列操作に変換できる操作があれば、通信オーバーヘッドを必要とせずに大幅な速度節約を行うことができます。

  5. matlab 以外のものを試してください。時間とコーディング スキルがあれば、OpenMP を使用した C++ などのマルチスレッド実行が可能な言語で関数を再コーディングできます。

私自身、Matlab での並列プログラミングで同様の問題に直面しましたが、私の場合、入力データを共有しているにもかかわらず、問題は恥ずかしいほど並列であったため、出力をワーカー ノードから直接ディスクに保存することになりました。

于 2013-03-27T16:52:26.240 に答える