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

时间:2011-07-11 16:06:13

标签: synchronization mpi broadcast

调用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

表明,尽管只有发送者正在调用MPI_BCAST,但两个线程都会完成。

输出:

1 done           0
0 done           0

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

2 个答案:

答案 0 :(得分:1)

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

您的代码太简单了,无法进行调试。你能发表一个展示问题的工作最小例子吗?

答案 1 :(得分:1)

我可以证明MPI_Bcast NOT 阻止,至少对于根(发送)进程来说。如果您想确定您的程序阻止,请立即致电MPI_Barrier。我知道这是因为我最近意外地调用了MPI_Bcast根进程(而不是集体),并且程序执行继续正常,直到很久以后对{{1}的NEXT无关调用},其中旧缓冲区被接收到新的不同缓冲区中。缓冲区数据类型/长度的这种不匹配产生了垃圾数据,我花了一段时间才找到该错误。