1

私の質問は、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);


}
4

1 に答える 1