发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗

Posted

技术标签:

【中文标题】发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗【英文标题】:sending multiple mpi non blocking send - will it preserve the sent order 【发布时间】:2012-02-21 17:56:54 【问题描述】:

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

    MPI_Isend (); MPI_Isend (); MPI_Isend ();

和3个对应​​的receive

    MPI_Recv(); MPI_Recv(); MPI_Recv();

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

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

【问题讨论】:

【参考方案1】:

更新:我认为下面 cmets 中的 Jeremiah Willcock 是对的,而这个答案是错误的。

如果三个ISends被顺序调用,并且receives都匹配它们,那么一个send操作是否更大,或者更快,或者其他什么都没有关系; MPI 的不超车保证告诉您消息将按照 Isend 的发送顺序到达(因此可用于 Recv)。

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

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

【讨论】:

这是不正确的——参见 MPI 2.2 规范中关于不超车的第 3.5 节;上面的代码需要以与发送发生的顺序相同的顺序匹配接收。不过,这仅适用于发送具有相同通信器和标签的情况。 老兄,这就是我在回答的第二段中所说的。 你的回答不是说发送可以被任何一个接收接收吗? 是的,除非你想用标签来区分它们。或者,就此而言,传播者。但是 MPI 的新手几乎从不小心地为这些东西使用标签,而且 OP 也从未在帖子中的任何地方提及它们。 除了问题所暗示的是完全安全且定义明确的,即使没有标签。

以上是关于发送多个 mpi 非阻塞发送 - 它会保留发送的顺序吗的主要内容,如果未能解决你的问题,请参考以下文章

MPI 非阻塞发送和接收排序

一个不安全的 MPI 非阻塞通信示例?

用于未知消息大小的 MPI 非阻塞发送和接收以及 mpi_iprobe()

非阻塞点对点通信中发送模式对 MPI 开销的影响

MPI 非阻塞发送/接收中的请求数组

同步阻塞同步非阻塞异步阻塞异步非阻塞--简明介绍