1

(問題は恥ずかしいほど並列です)

12 個のセルの配列を考えてみましょう。

|__|__|__|__|__|__|__|__|__|__|__|__|

および 4 つの CPU。

単純に、4 つの並列ジョブを実行し、各 CPU に 3 つのセルを供給します。

|__|__|__|__|__|__|__|__|__|__|__|__|
=========|========|========|========|
   1 CPU    2 CPU    3 CPU    4 CPU

しかし、各セルには異なる評価時間があり、一部のセルは非常に迅速に評価され、一部のセルは評価されないようです。

したがって、「リラックスした CPU」を浪費する代わりに、各セルを各 CPU に一度にフィードし、ジョブ全体が完了するまで続行することを考えています。

すなわち:

最初に:

|____|____|____|____|____|____|____|____|____|____|____|____|
 1cpu 2cpu 3cpu 4cpu

2cpu がセル "2" でジョブを終了した場合、最初の空のセル "5" にジャンプして作業を続けることができます。

|____|done|____|____|____|____|____|____|____|____|____|____|
 1cpu      3cpu 4cpu 2cpu
       |-------------->

1cpu が終了した場合、6 番目のセルを使用できます。

|done|done|____|____|____|____|____|____|____|____|____|____|
           3cpu 4cpu 2cpu 1cpu 
  |------------------------>

など、完全な配列が完了するまで。

質問:

どのセルが「速い」セルで、どのセルが「遅い」セルなのかアプリオリにわからないため、負荷に応じて CPU を分散することはできません (CPU を増やして遅くし、CPU を減らして速くします)。MPI を使用した動的評価のために、このようなアルゴリズムをどのように実装できますか?

ありがとう!!!!!

アップデート

IO-MPI を使用して、ジョブ全体をチャンクに分割する方法という非常に単純なアプローチを使用します。

指定: array[NNN] およびnprocs - 使用可能な作業単位の数:

for (int i=0;i<NNN/nprocs;++i)
{
  do_what_I_need(start+i);
}
MPI_File_write(...);

ここで、「開始」は特定のランク番号に対応します。簡単に言えば、使用可能な CPU の数に応じて NNN 配列全体を固定サイズのチャンクに分割し、各 CPU がそのチャンクを実行し、結果を (共通) 出力に書き込んで緩和します。

各CPUが(NNN / nprocではなく)1回の反復のみを取得し、ジョブが完了して書き込みを行うような方法でコードを変更することは可能ですかファイルへのその部分は、次のセルに進み、リラックスしないでください。

ありがとう!

4

3 に答える 3

3

よく知られた並列プログラミング パターンがあり、さまざまな名前で知られています。その中には、bag of tasksmaster / workertask farmwork poolなどがあります。他のプロセス (ワーカー)。各ワーカーは、マスターからのメッセージを待機し、何かを計算して結果を返すという無限ループを実行します。ループは、マスターに特別なタグを付けたメッセージを送信させることで終了します。MPI_ANY_TAGワーカーはワイルドカード タグ値を使用して、さまざまなタグを持つメッセージを受信できます。

マスターはより複雑です。また、ループを実行しますが、すべてのセルが処理されるまでです。最初に各ワーカーにセルを送信し、ループを開始します。このループでは、ワイルドカード ソース値を使用して任意のワーカーからメッセージを受信し、MPI_ANY_SOURCEさらに処理するセルがある場合は、結果を返した同じワーカーにそのうちの 1 つを送信します。それ以外の場合は、タグが終了値に設定されたメッセージを送信します。

インターネット上には、このモデルのすぐに利用できる実装が数多くあり、スタック オーバーフロー (たとえば、これ) にもいくつかあります。このスキームでは、多くの場合ほとんど作業を行わない追加の MPI プロセスが 1 つ必要になることに注意してください。これが受け入れられない場合は、別のスレッドでワーカー ループを実行できます。

于 2013-06-12T17:06:12.090 に答える
1

労働者が仕事をしていないときはいつでもサーバーに仕事を依頼する、一種のクライアントサーバーアーキテクチャを実装したいと考えています。

チャンクのサイズとワーカーとサーバー間の通信速度に応じて、ワーカーに送信されるチャンクのサイズを調整する必要がある場合があります。

于 2013-06-12T17:08:16.653 に答える
1

更新された質問に答えるには:

マスター/スレーブ (または、ラベル付けを希望する場合はワーカー プール) モデルでは、基本的にタスク スケジューラが必要です。マスターは、どの作業が完了し、まだ何を行う必要があるかについての情報を持っている必要があります。マスターは、各プロセスに実行する作業を与えてから、プロセスが完了するまで待機します (ノンブロッキング受信と wait_all を使用)。プロセスが完了したら、データをマスターに送信し、マスターが応答してさらに作業を行うのを待ちます。作業が完了するまでこれを続けます。

于 2013-06-14T18:30:34.460 に答える