MPI_Isend / Recv-是否存在死锁?

时间:2011-05-19 16:50:11

标签: c++ mpi

我使用MPI在4个节点上传递了8条消息。我注意到有两条消息的数组没有提供有意义的结果。我复制了以下代码的摘录?这些是我根据下面的代码/结果提出的一些相关问题:

  1. MPI_Isend还需要等待吗?我不确定是否存在僵局。我也尝试将这两个变量从一个节点传递到另一个节点,并且数组值仍为NULL。
  2. MPI_SendRecv是否会提高此处Non Blocking communication in MPI and MPI Wait Issue. Not all information is passed correctly建议的代码效率?如果是这样,怎么/为什么?也会赞赏一些关于设置它的指示。
  3. 谢谢!

    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]);
    }
    

1 个答案:

答案 0 :(得分:1)

是的,所有非阻塞调用(MPI_Isend,MPI_Irecv等)都需要匹配的MPI_Wait。在调用MPI_Wait之前,不保证完成调用。在MPI_Wait返回之前,不应更改缓冲区的内容。

https://computing.llnl.gov/tutorials/mpi/

要使用SendRecv,同样的任务必须发送消息并等待接收消息。这种模式对你的代码不适用。