3

我有一个程序,其中有一个主/从设置,并且我为主实现了一些功能,这些功能向从属发送不同类型的数据。一些功能发送到单个从站,但一些通过 MPI_Bcast 向所有从站广播信息。

我想在从站中只有一个接收功能,所以我想知道我是否可以探测一条消息并知道它是作为正常阻塞消息广播还是发送,因为有不同的方法来接收广播的内容和接收的内容已正常发送。

4

1 回答 1

5

不,您无法根据探测调用决定是调用 Bcast 还是 Recv。

MPI_Bcast 调用是一个集体操作——所有 MPI 任务都必须参与。结果,这些不像点对点通信;他们利用所有进程都参与的事实来进行高阶优化。

因为集体操作意味着如此多的同步,所以让其他任务检查它们是否应该开始参与集体是没有意义的;这是必须内置到程序逻辑中的东西。

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

  • 另一个进程在广播中的作用与接收消息不同;一般来说,它将同时接收和发送信息。所以参与广播不同于进行简单的 Recv 调用。

所以探针不起作用;MPI_Probe 的文档非常清楚,它返回有关下一次 MPI_Recv 会发生什么的信息,并且 Recv 是与 Bcast 不同的操作。

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

于 2012-06-13T11:55:54.930 回答