与发送方和接收方的MPI_BCAST隐含同步?

agr*_*ppa 6 synchronization broadcast mpi

在调用MPI_BCAST时,是否有任何隐含的同步?例如,如果发送者进程在其他人可以进入MPI_BCAST之前进行BCAST然后继续而没有任何确认?最近的一些测试代码如:

program test
include 'mpif.h'

integer ierr, tid, tmp

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ierr)

tmp = tid

if(tid.eq.0) then
  call MPI_BCAST(tmp,1,MPI_INTEGER,MPI_ROOT,MPI_COMM_WORLD, ierr)
else

endif

write(*,*) tid,'done'
call MPI_FINALIZE(ierr)

end
Run Code Online (Sandbox Code Playgroud)

尽管只有发送者正在调用MPI_BCAST,但它显示两个线程都完成了.

输出:

1 done           0
0 done           0
Run Code Online (Sandbox Code Playgroud)

这可能是我正在使用的MPI安装(MPICH)的问题,还是MPI的标准行为?

sus*_*att 1

Bcast是集体通信呼叫,因此是块。更准确地说,它会阻塞,直到指定通信器中的所有进程都对 进行匹配的调用Bcast,此时发生通信并继续执行。

您的代码对于调试目的来说过于简化。您可以发布一个演示该问题的最小工作示例吗?

  • 这个答案并不完全正确。来自 MPI 标准 v3 第 5.1 节:“依靠集体操作的同步副作用来保证程序正确性是危险的。例如,即使特定的实现可能提供具有同步副作用的广播例程,但标准不需要这个,依赖于此的程序将不可移植。”。“Bcast”*不需要*阻塞所有进程,直到操作完成。 (4认同)