MPI_Barrier - 只有一些进程通过屏障

Posted

技术标签:

【中文标题】MPI_Barrier - 只有一些进程通过屏障【英文标题】:MPI_Barrier - Only some processes passes the barrier 【发布时间】:2016-10-07 23:46:39 【问题描述】:

我面临的情况是只有一些进程绕过MPI_Barrier 函数。

问题出现在这段代码中:

printf("[%d] Before barrier\n", mpi_rank);
fflush(stdout);
MPI_Barrier(MPI_COMM_WORLD);
printf("[%d] After barrier\n", mpi_rank);
fflush(stdout);
sleep(1);

用 4 个进程运行它后,我有以下输出:

[3] Before barrier
[2] Before barrier
[0] Before barrier
[1] Before barrier
[1] After barrier

然后应用程序冻结。

我希望所有进程都能打印消息[id] After barrier,但只有进程1 打印了它。

为什么不是所有进程都通过屏障?

我期待这样的输出:

[3] Before barrier
[2] Before barrier
[0] Before barrier
[1] Before barrier
[1] After barrier
[0] After barrier
[2] After barrier
[3] After barrier

我在 docker 中使用 openmpi 和 centos。应用程序启动了多个线程,但显示的片段不在其中。

【问题讨论】:

请解释为什么您认为问题与障碍有关。在我看来,所有四个进程都达到了障碍,然后进程 1 能够继续。之后发生的事情与障碍无关。 好的。问题已编辑,解释了预期的输出。谢谢。 仍然无法说什么,因为您没有提供重现问题的最小工作示例。代码片段本身没有任何问题。因此,第一个怀疑是这种行为是由于代码的其他部分造成的(例如,您可能事先在其他进程上调用了非阻塞屏障,现在与进程 1 上的 MPI_Barrier 调用相匹配)。它是否适用于不同数量的进程?也许是环境的原因,它在其他系统上是否有效?多线程是什么意思? @haraldkl,“与点对点操作不同,非阻塞集合操作与阻塞集合操作不匹配” - 直接来自 MPI 标准。 @Zulan,给定通信器上的集体调用顺序(阻塞或非阻塞)在所有等级中必须相同,因此根据您描述的这种情况确实是错误的到标准。如果 OP 并没有真正做些乱七八糟的事情,我会更倾向于假设这是另一种网络接口配置错误的情况(Open MPI 很容易出现这种情况)。 【参考方案1】:

我也遇到过类似的问题,开始在网上搜索。我发现 - 据我了解 - OpenMPI 中 MPI_Barrier 的实现可能有问题,具体取决于特定版本。

https://github.com/open-mpi/ompi/issues/3042

MPI_Barrier doesn't function properly

【讨论】:

以上是关于MPI_Barrier - 只有一些进程通过屏障的主要内容,如果未能解决你的问题,请参考以下文章

共享内存中进程间的屏障实现

测试 MPI_Barrier C++

什么时候需要使用 MPI_Barrier()?

MPI 屏障 C++

MPI_BARRIER 不工作

对 MPI_Barrier 的调用是不是会影响 MPI 进程中的每个线程?