2017-02-24 7 views
0

MPI_IsendとMPI_Irecendのコードブロックに問題があります。私はライン上の次のプロセスにCinの番号を送る必要があります、そして、現在のプロセスは、それがビジネスだと考えることができます。MPI IsendとIrecvの問題

受信プロセスはそれ以上の計算に入る前に受信する必要がありますが、MPI_Waitを持たない場合はneversがデータを取得し、それを行うと永遠にハングします。私は間違って何をしていますか?

注:メッセージが通過しないことを確認するためにCinのみを3に設定します。現在、それはちょうどハングアップします。

void ComputeS5C() 
{ 
    MPI_Request send_request, recv_request; 
    MPI_Status status; 
    int Cin[1] = {3}; 
    if(my_rank == 0){Cin[0] = 0;} 
    else { 
     MPI_Irecv(Cin, 1, MPI_INT, my_rank - 1, 0, MPI_COMM_WORLD, &recv_request); 
     MPI_Wait(&recv_request, &status); 
     fprintf(stderr, "RANK:%d Message Received from rank%d: Cin=%d\n", my_rank, my_rank-1, Cin[0]); 
    } 

    int k; 
    for(k = 0; k < Size_5; k++) 
    { 
     int s5clast; 
     if(k==0) 
     { 
      s5clast = Cin[0]; 
     } 
     else 
     { 
      s5clast = s5c[k-1]; 
     } 

     s5c[k] = s5g[k] | (s5p[k]&s5clast); 
    } 

    //if not highest rank, pass the carryin upstream 
    if(my_rank < world_size - 1){ 
     MPI_Isend(&s5c[k], 1, MPI_INT, my_rank+1, 1, MPI_COMM_WORLD, &send_request); 
     fprintf(stderr, "RANK:%d Message sent to rank%d: Cin=%d\n", my_rank, my_rank+1, s5c[k]); 
    } 
    MPI_Wait(&send_request, &status); 
} 

答えて

2

コードのエラーは、tagsのミスマッチと関係がある。メッセージはtag = 1を使用して送信され、tag = 0を使用して受信されます。送信と受信は、送信されたメッセージが消費されるのを待っているすべてのプロセスが停止している理由を説明するものではありません。タグが一致するように変更します。

注記MPI_Irecvを使用する場合は、いつ受信データを安全に消費するかを確実に確認するには、MPI_Waitが必要です。私はあなたの例ではMPI_Recvの使用がより適切であると思います。

+0

良いキャッチ!ここで私はタグが本当に問題ではないと思っていた。 – Wenzel745

+0

タグは私の友人にとって非常に重要です... expeciallyあなたが15点を必要とするときstackoverflow :) – simpel01