发送多个mpi非阻塞发送-是否保留发送顺序

发送多个mpi非阻塞发送-是否保留发送顺序,mpi,Mpi,假设我有3个这样的非阻塞发送 MPI_Isend() MPI_Isend() MPI_Isend() 以及相应的3个接收 MPI_Recv() MPI_Recv() MPI_Recv() 现在假设第二个Isend不发送,因为它是非阻塞的,第三个Isend将被发送。现在,MPI_Recv功能是否会得到预期的功能 我的意思是,第一次MPI发送会将数据发送到第一次接收,第二次MPI发送到第二次MPI接收,依此类推。更新了:我认为下面的Jeremiah Willcock评论是正确的,而这个答案是错误的

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

  • MPI_Isend()
  • MPI_Isend()
  • MPI_Isend() 以及相应的3个接收

  • MPI_Recv()
  • MPI_Recv()
  • MPI_Recv() 现在假设第二个Isend不发送,因为它是非阻塞的,第三个Isend将被发送。现在,MPI_Recv功能是否会得到预期的功能

    我的意思是,第一次MPI发送会将数据发送到第一次接收,第二次MPI发送到第二次MPI接收,依此类推。

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

    如果这三个ISEND是按顺序调用的,并且接收端都匹配它们,那么发送操作是否更大、更快或其他都无关紧要;MPI的非超车保证告诉您消息将按照ISEND发出的顺序到达(从而可供Recv使用)

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


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

    这是不正确的——参见MPI 2.2规范中关于不超车的第3.5节;上面的代码需要按照发送发生的相同顺序匹配接收。但是,这只适用于发送具有相同的通信器和标记的情况。伙计,这就是我在回答的第二段中所说的。你的回答不是说发送可以被任何一个接收接收到吗?是的,除非你想用标记来区分它们。或者,就这一点而言,是传播者。但是MPI的新手几乎从来没有仔细使用过标签,OP也从来没有在帖子的任何地方提到过它们。除了这个问题所建议的是完全安全和定义良好的,即使没有标签。