2011-05-19 81 views
0

我注意到並不是所有的MPI_Isend/MPI_IRecv都正在執行。我認爲這可能或者是我發送和接收的順序,或者是代碼不等待所有命令執行的事實。我已經複製下面代碼的摘錄。你能否建議我可能做錯了什麼?MPI和MPI等待問題中的非阻塞通信。並非所有信息都正確傳遞

謝謝!這段代碼執行後

MPI_Status status[8]; 
MPI_Request request[8]; 
.... 
.... 
if ((my_rank) == 0) 
{ 
     MPI_Isend(eastedge0, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &request[0]); 
     MPI_Irecv(westofwestedge0, Rows, MPI_DOUBLE, my_rank+1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[6]); 
     MPI_Wait(&request[6], &status[6]); 
} 

if ((my_rank) == 1) 
{ 
     MPI_Irecv(eastofeastedge1, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[0]); 
     MPI_Wait(&request[0], &status[0]); 
     MPI_Isend(westedge1, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, &request[6]); 
} 

回答

2

無論是等級0或1仍然可以發送數據(只要你不發送請求對象等)。如果您在完成發送之前修改數據,這可能會導致問題。

對於這個特定的例子,也許MPI_Sendrecv將是有用的?

1

對於每個對非阻塞MPI調用的調用,都必須有相應的等待。每個進程缺少一個等待。