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

Non Blocking communication in MPI and MPI Wait Issue. Not all information is passed correctly

本文关键字:MPI 信息 问题 通信 等待      更新时间:2023-10-16

我注意到并非所有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 或 1 仍可能发送数据(因为您不等待发送请求对象)。如果在数据完成发送之前修改数据,这可能会导致问题。

对于这个特定的例子,也许MPI_Sendrecv有用?

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