停止进程继续,直到其他人完成 MPI

计算科学 正则 mpi
2021-12-13 17:22:09

我正在使用 MPI 循环一个数组。问题是,我认为在其他进程完成之前,一些进程正在进入下一次迭代。这给我带来了问题,因为下一次需要在每次迭代中每个进程计算的数据。他们是一种我可以在循环结束时暂停进程直到所有其他进程完成当前迭代的方法吗?(如果有什么不同,我会使用 Fortran90)谢谢!

2个回答

MPI_Barrier可用于同步通信器中的所有进程每个进程都必须等到所有其他进程都到达屏障后才能继续进行:

MPI_BARRIER(COMM, IERROR)

这里 COMM 是通信器句柄, IERROR 是错误状态。

请注意,有时有更聪明的方法可以在算法上处理此类依赖关系,但这高度依赖于问题。

虽然克里斯蒂安给了你正确的答案,但几乎可以肯定这不是你想要的。保证不必要的同步会限制代码的可伸缩性。如果所有处理器都需要来自所有其他处理器的数据,那么使用像 MPI_Alltoall() 这样的集合可能更合适。如果一个任务已经从其他任务接收到所有需要的数据,那么即使其他任务仍在进行上一次迭代,该任务继续进行通常也没有什么坏处。在这种情况下,您可能只能使用点对点通信。