(問題は恥ずかしいほど並列です)
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回の反復のみを取得し、ジョブが完了して書き込みを行うような方法でコードを変更することは可能ですかファイルへのその部分は、次のセルに進み、リラックスしないでください。
ありがとう!