发送多个mpi非阻塞发送 - 它将保留发送的订单

时间:2012-01-29 18:03:27

标签: mpi

说我有这样的3个非阻塞发送

  
      
  1. MPI_Isend();
  2.   
  3. MPI_Isend();
  4.   
  5. MPI_Isend();
  6.   

和3对应的接收

  
      
  1. MPI_RECV();
  2.   
  3. MPI_RECV();
  4.   
  5. MPI_RECV();
  6.   

现在假设第二个Isend没有发送,因为它的非阻塞第三个将被发送。现在,MPI_Recv函数是否会成为预期函数?

我的意思是第一个MPI_ISend将数据发送到第一个接收,第二个MPI_ISent发送到第二个MPI_Recv,依此类推。

1 个答案:

答案 0 :(得分:0)

更新了 :以下评论中的Jeremiah Willcock我认为是对的,这个答案是错误的。

如果三个ISend被顺序调用,并且receive都匹配它们,那么一个发送操作是更大,更快,还是其他什么并不重要; MPI的非超车保证会告诉您消息将按照Isends的顺序到达(因此可用于Recv)。

如果对ISend的调用被延迟,这是我最初解释问题的方式,或者是否按照建议调用失败(但请注意,如果调用失败,您将在以后遇到其他问题)然后原始答案成立:如果Recieves匹配任何所有Isend,并且调用到第二个ISend以某种方式被阻止,那么第一个MPI_Recv()将得到第一个Isend,第二个Recv将得到第三个Isend,第三个将挂起,直到第二个Isend发生。

如果要确保第一个MPI_Recv收到特定消息,则应使用标记来区分各种消息,并让接收指定该标记。