Fortran MPI屏障未阻塞

Fortran MPI屏障未阻塞,fortran,mpi,Fortran,Mpi,到目前为止,我认为MPI屏障正在阻塞。因此,当一个进程遇到MPI障碍时,它应该停止并等待其他进程到达相同的障碍 然后在某个时候,我编程了以下错误: [...] if (my_rank==0) then call mpi_barrier(mpi_comm_world,ierr) end if [...] 现在,我希望所有其他进程继续工作,并最终在下一次阻塞mpi调用时挂起。进程0在上述屏障处无限期等待 然而,事实并非如此。所有进程都继续执行,并且在代码中的下一次mpi调用时都挂起。在第

到目前为止,我认为MPI屏障正在阻塞。因此,当一个进程遇到MPI障碍时,它应该停止并等待其他进程到达相同的障碍

然后在某个时候,我编程了以下错误:

[...]
if (my_rank==0) then
    call mpi_barrier(mpi_comm_world,ierr)
end if 
[...]
现在,我希望所有其他进程继续工作,并最终在下一次阻塞mpi调用时挂起。进程0在上述屏障处无限期等待

然而,事实并非如此。所有进程都继续执行,并且在代码中的下一次mpi调用时都挂起。在第二次mpi调用之前,我打印了所有进程的排名,因此我知道它们都到达了该点,包括任务0

为了找到错误,我疯狂地进行了故障排除,直到我最终在代码中越来越深入地查看,发现了上面的错误

有人遇到过这样的行为吗?我是否对mpi_屏障工程有误解?我正在使用mvapich2.2和ifort15


谢谢你的帮助

这是一个无效的MPI程序,因此您正在观察一个未定义的行为。MPI要求所有列组中的集合调用遵循相同的顺序。在您的情况下,一个列组对
MPI\u BARRIER
进行顺序错误的调用。由于未指定屏障的具体实现方式,并且由于通用MPI库中的集合操作通常在内部使用点对点通信实现,因此无序集合可能会干扰其他MPI调用并导致观察到的行为。如果您需要一个(或一些)列组的屏障在一个地方和另一个地方的另一个地方使用相同的MPI通信时,您可以使用非阻塞屏障(MPI_Ibarrier)。@haraldkl,只有在“其他MPI通信之间”时才是这样不包括同一通讯器上的集体通讯-特定通讯器上的所有集体通讯顺序,无论是否阻塞,在所有等级中都必须相同。这是一个无效的MPI程序,因此您正在观察未定义的行为。MPI要求所有列组中的集合调用遵循相同的顺序。在您的情况下,一个列组对
MPI\u BARRIER
进行顺序错误的调用。由于未指定屏障的具体实现方式,并且由于通用MPI库中的集合操作通常在内部使用点对点通信实现,因此无序集合可能会干扰其他MPI调用并导致观察到的行为。如果您需要一个(或一些)列组的屏障在一个地方和另一个地方的另一个地方使用相同的MPI通信时,您可以使用非阻塞屏障(MPI_Ibarrier)。@haraldkl,只有在“其他MPI通信之间”时才是这样不包括通过同一个通讯器进行的集体通讯-通过特定通讯器进行的所有集体通讯的顺序,无论是否阻塞,在所有等级中都必须相同。