MPI_Bcast()是否阻止?

Ada*_*dam 3 parallel-processing mpi

MPI_Bcast()阻塞或非阻塞?换句话说,当根发送数据时,所有处理器是否都会阻塞,直到每个处理器都收到这些数据?如果没有,如何同步(阻止)所有这些,以便没有人继续进行,直到所有人都收到相同的数据.

Dav*_*nty 16

你需要对这里的术语有点小心,因为MPI的意思是"阻塞"可能不是你在其他环境中看到它的方式.

在MPI方面,Bcast 正在阻止.阻塞意味着,当函数返回时,它已经完成了它本来要做的操作.在这种情况下,这意味着从Bcast返回时,可以保证每个进程中的接收缓冲区都包含您要广播的数据.非阻塞版本是Ibcast.

在MPI术语中,您要问的是操作是否是同步的,即意味着进程之间的同步.对于诸如发送之类的点对点操作,这指的是发送方是否在从发送呼叫返回之前等待接收发送.对于集体行动,问题是是否存在障碍(正如@Vladimir所指出的那样).Bcast并不一定意味着障碍.

但是,我发布的原因是,在使用标准Send/Recv调用编写的几乎所有MPI程序中(与单面Put/Get相反),您不关心屏障后是否存在同步.所有每个流程都关心的是它已经收到了所需的数据 - 为什么其他流程正在做什么呢?如果您随后想要与任何其他进程通信,则MPI例程的设计将使所需的同步自动发生.如果您发出接收而另一个过程很慢,则等待; 如果你发出一个发送而另一个进程没有发出一个接收,一切都会正常工作(假设你没有调用Rsend - 你永远不应该调用Rsend!).是否存在同步对性能有影响,但很少影响程序是否正确.

除非进程通过其他一些机制进行交互(例如,所有进程都访问同一个文件),否则很难想出一个真实的例子,你关心Bcast是否同步.当然你总是可以构造一些边缘情况,但在MPI的实际应用中它几乎不重要.

许多MPI计划都充满了障碍,根据我的经验,它们几乎从不需要正确性; 唯一的常见用例是确保有效的性能测量时序.

  • _"...这意味着从 Bcast 返回时,可以保证每个进程中的接收缓冲区都包含您要广播的数据。"_ - 这对于根等级而言并非如此。一旦操作的 **local** 部分完成并且用户提供的缓冲区可以被重用,阻塞操作就会返回。在广播的情况下,操作可以在根节点完成,同时仍有消息在传输。我完全同意你的其余答案,尤其是最后一段。 (2认同)
  • 好吧 - 你是对的,我的回答不够清楚。我的意思是“这意味着当一个进程从广播返回时,可以保证该进程的接收缓冲区包含您想要广播的数据”。你是对的,我的原文错误地暗示这在全球范围内都是如此,而不仅仅是在本地。 (2认同)

Vla*_*r F 5

不,这种阻塞(等待其他进程完成他们的部分工作)对性​​能非常不利。每个进程只要它拥有它所需要的一切就会继续——这意味着它要接收的数据在那里,或者要发送的数据至少被复制到某个缓冲区。

MPI_Barrier如果您需要确保所有进程都完成,您可以使用 an来同步进程。如前所述,它会显着减慢程序的速度。在初始化我的代码时,我仅将它用于某些诊断日志记录。不是在实际集成期间。