调用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的这种标准行为?
答案 0 :(得分:1)
Bcast
是一个集体通信电话,就像这样的块。更准确地说,它会阻塞,直到指定通信器中的所有进程都对Bcast
进行匹配调用,此时通信发生并继续执行。
您的代码太简单了,无法进行调试。你能发表一个展示问题的工作最小例子吗?
答案 1 :(得分:1)
我可以证明MPI_Bcast
NOT 阻止,至少对于根(发送)进程来说。如果您想确定您的程序阻止,请立即致电MPI_Barrier
。我知道这是因为我最近意外地调用了MPI_Bcast
根进程仅(而不是集体),并且程序执行继续正常,直到很久以后对{{1}的NEXT无关调用},其中旧缓冲区被接收到新的不同缓冲区中。缓冲区数据类型/长度的这种不匹配产生了垃圾数据,我花了一段时间才找到该错误。