我有一个程序,其中有一个主/从设置,我有一些为主设备实现的功能,它们向从设备发送不同类型的数据。某些功能发送到各个从设备,但是通过MPI_Bcast向所有从设备发送一些广播信息。
我想在奴隶中只有一个接收功能,所以我想知道我是否可以探测一条消息并知道它是否被广播或作为正常的阻止消息发送,因为有不同的方法来接收是什么广播和正常发送的内容。
答案 0 :(得分: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;这只是允许更容易地进行集体和点对点通信的交错。