探测MPI_Bcast或MPI_Send

3

我有一个程序,其中有主/从设置,并且我已经实现了一些用于向从发送不同类型数据的主函数。有些函数向单个从发送,但是有些通过MPI_Bcast向所有从广播信息。

我希望在从中只有一个接收函数,因此我想知道是否可以探测消息并知道它是广播还是作为正常阻塞消息发送,因为接收广播和正常发送的方法不同。

1个回答

6
不,你不能基于探测调用来决定是调用 Bcast 还是 Recv。
MPI_Bcast 调用是一种集体操作,所有 MPI 任务都必须参与。因此,这些不像点对点通信;它们利用了所有进程参与的事实,以进行高阶优化。
由于集体操作意味着如此多的同步,允许其他任务检查是否应开始参与集体就没有意义;它是程序逻辑中必须内置的内容。
  • 根进程在广播中的角色不像发送;它通常不能只调用 MPI_Bcast 然后继续执行。实现几乎肯定会阻塞,直到某些其他数量的进程参与广播;和

  • 广播中其他进程的角色不像接收消息;通常它将同时接收和发送信息。因此,参与广播不同于进行简单的 Recv 调用。

所以 Probe 不起作用;MPI_Probe 的文档 相当清楚,它返回关于下一个 MPI_Recv 将会发生什么的信息,而 Recv 是不同于 Bcast 的操作。
您可能可以在现在正在完成的 MPI 3.0 中获得部分想要的功能,它允许非阻塞集合——例如,MPI_Ibcast。在这种情况下,您可以启动广播并调用 MPI_Test 来检查请求的状态。然而,即使在这里,每个人也需要先调用 MPI_Ibcast;这只是为了更轻松地交错集体和点对点通信。

谢谢回复!我想通过向所有从节点发送一个带有标签的阻塞消息,在广播之前告诉接收函数“准备”接收广播来解决这个问题。我正在将一个项目从PVM迁移到MPI,在PVM中有一个叫做pvm_mcast的函数,其行为类似于MPI_Bcast,但您可以使用非阻塞接收接收它,只是在想是否有类似于MPI的东西。我会读一下关于非阻塞集合的内容。 - Gumeo
1
pvm_mcastMPI_Bcast不同。它是一种多播操作,而不是广播操作,其语义类似于如果您发出多个MPI_Send操作时所得到的内容。它允许您将数据发送到任意子进程,而MPI_Bcast则将数据发送到_所有_进程,这样可以进行一些更高级别的优化。如果原始代码没有使用pvm_mcast来执行完整的广播,则最好只使用一堆MPI_Isend后跟MPI_Waitall。然后您就能够探测了。 - Hristo Iliev
谢谢,我现在已经完全掌握了pvm_mcast的概念以及与MPI_Bcast相比的功能。 - Gumeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接