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 - 只有一些进程通过屏障的主要内容,如果未能解决你的问题,请参考以下文章