私の質問は、MPI を使用してワーカーの動的プールを作成する方法です。
大きな (NNN = 10^6-7 要素) 1D 配列/ベクトルがあります。各セルでいくつかの計算を実行する必要があります。この問題は非常に恥ずかしいほど並列です。
アイデアは (正常に動作します): 各 MPI プロセス (並列実行時) は共通の .dat ファイルを読み取り、サイズ NNN のローカル (各ランク) の大きなベクトルに値を入れ、大きな配列の適切な部分である長さで計算を実行します。この「部分」の NNN/nprocs です。ここで、「nprocs」は MPI のプロセス数です。
問題: この配列 (NNN/nprocs) の一部の「部分」は非常に迅速に終了するため、一部の CPU は使用されません (他の CPU が実行を終了するのを待ちます)。
質問 1: 動的スケジュールの作成方法。タスクを完了した CPU は、新しいタスクを選択して作業を続行できます。
質問 2: 自動的に「ワーカー」とタスクをスケジュールする MPI 組み込みプロシージャはありますか?
これが私のコードです(静的スケジュール)
{
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Offset offset;
MPI_File file;
MPI_Status status;
int Pstart = (NNN / nprocs) * rank + ((NNN % nprocs) < rank ? (NNN % nprocs) : rank);
int Pend = Pstart + (NNN / nprocs) + ((NNN % nprocs) > rank);
offset = sizeof(double)*Pstart;
MPI_File_open(MPI_COMM_WORLD, "shared.dat", MPI_MODE_CREATE|MPI_MODE_WRONLY, MPI_INFO_NULL, &file);
double * local_array;
local_array = new double [NNN/nprocs];
for (int i=0;i<NNN/nprocs;i++)
{
/* next line calculates integral on each cell element of part NNN/nprocs of large array NNN */
adapt_integrate(1, Integrand, par, 2, a, b, MaxEval, tol, tol, &val, &err);
// putting result of integration to local array NNN/nprocs
local_array[i] = val;
}
// here, all local arrays are written to one shared file "shared.dat"
MPI_File_seek(file, offset, MPI_SEEK_SET);
MPI_File_write(file, local_array, NNN/nprocs, MPI_DOUBLE, &status);
MPI_File_close(&file);
}