2017-10-04 4 views
0

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 

。他の結果は正しいです。

誰かが自分のコードで何が問題なのか確認できますか?

ありがとうございます。

答えて

2

はここので、あなたが任意のタスクからのデータを待つj繰り返しでマスター

for(j=0;j<num_Proc;j++){ 
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE); 
    sum_local += sum_partial[j]; //Sum all results 
} 

であなたのループですが、その後、あなたは暗黙的にタスクjからのデータを受信したと仮定し(例えば、あなたはsum_partial[j]にアクセス)。

することができますいずれか

for(j=0;j<num_Proc;j++){ 
    MPI_Wait(&req[j], MPI_STATUS_IGNORE); 
    sum_local += sum_partial[j]; //Sum all results 
} 

または

for(j=0;j<num_Proc;j++){ 
    MPI_Waitany(num_Proc, req, &source, MPI_STATUS_IGNORE); 
    sum_local += sum_partial[source]; //Sum all results 
} 

はただ明確にするために、あなたはそれが4つのタスクと「作業」を行ったと思ったが、あなただけラッキーだった可能性が高いです。

+0

これだけです。私はそれがとても分かりやすいとは信じられません。ありがとうございました。 –

+0

あなたは歓迎されています。 –

関連する問題