2017-02-24 126 views
0

我遇到了我的MPI_Isend和MPI_Irecv代碼塊問題。我需要發送一個數字Cin到下一個流程,然後當前的流程可以開展業務。MPI Isend和Irecv問題

接收過程需要接收才能進一步進行計算,但是當我沒有MPI_Wait時,neine會獲取數據,而當我這樣做時,它會永遠掛起。我究竟做錯了什麼?

注意:我只將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

標籤是非常重要的我的朋友...特別是當你需要15點在stackoverflow :) – simpel01