MPI和MPI等待问题中的非阻塞通信。并非所有信息都正确传递

时间:2011-05-19 00:19:01

标签: c++ mpi

我注意到并非所有的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]);
}

2 个答案:

答案 0 :(得分:2)

在执行此代码块之后,等级0或1仍然可以发送数据(因为您不等待发送请求对象)。如果在完成发送之前修改数据,这可能会导致问题。

对于这个特定的例子,或许MPI_Sendrecv会有用吗?

答案 1 :(得分:1)

对于非阻塞MPI呼叫的每次呼叫,都必须有相应的等待。每个进程都缺少一次等待。