mpiで動的プロセス作成を使用しようとしていますが、子プロセスから応答を受け取るのに問題があります。私は各子の結果を格納するためにsum_partialというベクトルを作成しました。 4つのプロセス(1つの親プロセス+ 3つの子プロセス)を実行すると、正常に動作します。しかし、私がより多くのプロセスを実行するとき、sum_partialはいくつかの子の結果を取得しません。MPI_Waitanyがいくつかのプロセスを待っていません
問題がMPI_IrecvかMPI_Waitanyかどうかはわかりません。私はMPI_Wait、MPI_Waitall、MPI_Testを使って他のアプローチを試みました。しかし、この問題は繰り返されます。
ここでは、親プロセスで使用しているコードのMPIブロックを示します。
//Some code here...
for(j=0;j<num_Proc;j++){
sprintf(argv[2], "%llu", vetIni[j+1]);
sprintf(argv[3], "%llu", vetEnd[j+1]);
MPI_Comm_spawn(bin, argv, 1, localInfo, 0, MPI_COMM_SELF, &intercommChild[j], err);
}
long long int sum_local=0, *sum_partial = calloc(num_Proc, sizeof(long long int));
for(j=0;j<num_Proc;j++)
MPI_Irecv(&sum_partial[j], 1, MPI_LONG, 0, 99, intercommChild[j], &req[j]);
long long int ini = vetIni[0], end = vetEnd[0];
for(i=ini;i<end;i++)
sum_local += i * (N-i); //Parent process do it's computation
for(j=0;j<num_Proc;j++){
MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE);
sum_local += sum_partial[j]; //Sum all results
}
MPI_Finalize();
次に、子プロセスが実行するコードを示します。
//Some code here...
long long int ini = atol(argv[2]);
long long int end = atol(argv[3]);
long long int sum=0, i;
for(i=ini;i<end;i++)
sum += i*(N-i);
MPI_Send(&sum, 1, MPI_LONG, 0, 99, intercommPai);
MPI_Finalize();
私は7子で実行sum_partialを印刷する場合、それは次のようになります。これらのゼロが存在することになっていません
-8393498447644280608
4191132954560973024
0
0
-3708736119148578592
9184626552355719392
-903258050952161056
。他の結果は正しいです。
誰かが自分のコードで何が問題なのか確認できますか?
ありがとうございます。
これだけです。私はそれがとても分かりやすいとは信じられません。ありがとうございました。 –
あなたは歓迎されています。 –