我注意到并非所有的MPI_Isend / MPI_IRecv都被执行了。我想它可能是我发送和接收的顺序,或者代码不等到所有命令执行的事实。我已经从下面的代码中复制了摘录。你能否建议我做错了什么?
谢谢!
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]);
}
答案 0 :(得分:2)
在执行此代码块之后,等级0或1仍然可以发送数据(因为您不等待发送请求对象)。如果在完成发送之前修改数据,这可能会导致问题。
对于这个特定的例子,或许MPI_Sendrecv会有用吗?
答案 1 :(得分:1)
对于非阻塞MPI呼叫的每次呼叫,都必须有相应的等待。每个进程都缺少一次等待。