探测 MPI_Bcast 或 MPI_Send

Gum*_*meo 3 hpc mpi

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

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

Jon*_*rsi 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;这使得集体通信和点对点通信更容易交错。