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

kli*_*ijo 6 mpi

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

  1. MPI_Isend();
  2. MPI_Isend();
  3. MPI_Isend();

和3相应的接收

  1. MPI_RECV();
  2. MPI_RECV();
  3. MPI_RECV();

现在假设第二个Isend没有发送,因为它的非阻塞第三个将被发送.现在MPI_Recv函数会得到预期的函数吗?

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

Jon*_*rsi 1

更新:下面评论中的 Jeremiah Willcock 我认为是正确的,而这个答案是错误的。

如果三个 ISend 被顺序调用,并且接收都与它们匹配,那么发送操作是否更大、更快或其他什么都无关紧要;MPI 的不超载保证告诉您消息将按照 Isend 的顺序到达(因此可用于 Recv)。

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

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