2012-06-13 45 views
2

我有一个程序,其中有一个主/从设置,并且我有一些功能实现了向主设备发送不同类型的数据到从设备。有些功能会发送给各个从站,但有些功能会通过MPI_Bcast向所有从站发送信息。MPI_Bcast或MPI_Send的探测器

我想在从站只有一个接收函数,所以我想知道我是否可以探测一条消息,并知道它是作为普通阻塞消息广播还是发送,因为有不同的方法来接收被播出,并正常发送。

回答

4

不,您无法决定是否根据探测呼叫调用Bcast或Recv。

MPI_Bcast调用是一个集体操作 - 所有MPI任务都必须参与。因此,这些不像点对点的交流;他们利用所有进程都参与进行更高阶优化的事实。

由于集体操作意味着如此多的同步,所以只允许其他任务检查是否应该开始参与集体是没有意义的;这是必须构建到程序逻辑中的东西。

  • 根进程在广播中的角色不像发送;一般来说,它不能通过调用MPI_Bcast然后继续。实施几乎肯定会阻止,直到其他一些进程参与广播;和

  • 其他进程在广播中的角色不像接收消息;一般来说,它将同时接收和发送信息。因此参与广播与进行简单的Recv呼叫不同。

所以探头将无法工作; the documentation for MPI_Probe相当清楚,它返回关于下一个MPI_Recv会发生什么的信息,并且Recv是与Bcast不同的操作。

您可以在MPI 3.0中获得一些您想要的内容,现在正在定稿,这允许非阻塞集体 - 例如MPI_Ibcast。在这种情况下,您可以启动广播并调用MPI_Test来检查请求的状态。然而,即使在这里,每个人都需要先打电话给MPI_Ibcast;这只是允许集体和点对点通信更容易交错。

+0

感谢您的回应!我想我可以通过发送一个阻止信息给广播前的所有从属设备来解决这个问题,这个标记告诉接收功能“准备”广播。我正在将一个项目从PVM迁移到MPI,并且在PVM中他们有一个名为pvm_mcast的函数,它的行为与MPI_Bcast类似,但您可以通过非阻塞接收来接收它,只是在MPI中出现类似情况时才会流浪。我会读一些关于无阻塞的集体。 – Gumeo

+1

'pvm_mcast'与'MPI_Bcast'不同。它是一个多播操作,而不是广播操作,其语义与发出多个MPI_Send操作时的相似。它允许您将数据发送到任意子进程,而'MPI_Bcast'将数据发送到_all_进程并允许进行更高级别的优化。如果原始代码没有使用'pvm_mcast'来执行完整的广播,那么最好使用一堆'MPI_Isend',然后是'MPI_Waitall'。然后你就可以探索。 –

+0

谢谢,我想我已经完全理解了pvm_mcast的概念,并且它的功能与MPI_Bcast相比。 – Gumeo