我使用MPI在4个节点上传递了8条消息。我注意到有两条消息的数组没有提供有意义的结果。我复制了以下代码的摘录?这些是我根据下面的代码/结果提出的一些相关问题:
谢谢!
Source Code:
if ((my_rank) == 0)
{
MPI_Irecv(A, 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_Isend(AA, Rows, MPI_DOUBLE, my_rank-1, 0, MPI_COMM_WORLD, &request[6]);
}
if ((my_rank) == 2)
{
MPI_Isend(B, Rows, MPI_DOUBLE, my_rank+1, 0, MPI_COMM_WORLD, &request[7]);
}
if ((my_rank) == 3)
{
MPI_Irecv(BB, Rows, MPI_DOUBLE, my_rank-1, MPI_ANY_TAG, MPI_COMM_WORLD, &request[7]);
MPI_Wait(&request[7], &status[7]);
}
答案 0 :(得分:1)
是的,所有非阻塞调用(MPI_Isend,MPI_Irecv等)都需要匹配的MPI_Wait。在调用MPI_Wait之前,不保证完成调用。在MPI_Wait返回之前,不应更改缓冲区的内容。
https://computing.llnl.gov/tutorials/mpi/
要使用SendRecv,同样的任务必须发送消息并等待接收消息。这种模式对你的代码不适用。