【问题标题】:Make slaves wait for each other in MPI在 MPI 中让 slave 互相等待
【发布时间】:2016-04-14 19:07:42
【问题描述】:

我的 MPI 程序中有一个主从模型。我想让奴隶在进入下一次迭代之前互相等待。

if (rank == 0) {
    // master process
} else {
    // slave process
    for (int i = 0; i < 10; i++) {
        // do stuff
        // wait for all slaves to end iteration i
    }
}

基本上,我不希望任何处理器在所有其他从属设备都完成当前迭代的情况下进入下一次迭代。我怎样才能做到这一点?与MPI_Barrier?

【问题讨论】:

    标签: c++ parallel-processing synchronization mpi


    【解决方案1】:

    您可以创建一个包含所有从属进程的通信器,并在MPI_Barrier() 上使用它。 从创建这个通信器开始,最简单/最安全的方法是这样使用MPI_Comm_split()

    MPI_Comm slaves;
    MPI_Comm_split( MPI_COMM_WORLD, ( rank == 0 ), rank, &slaves );
    

    这实际上将全局创建 2 个通信器:一个仅包含主进程,另一个包含除主进程之外的所有进程。

    实际使用可以这样操作:

    if (rank == 0) {
        // master process
    } else {
        // slave process
        for (int i = 0; i < 10; i++) {
            // do stuff
            // wait for all slaves to end iteration i
            MPI_Barrier( slaves );
        }
    }
    

    【讨论】:

    • 工作就像一个伤害。你也可以看看this吗?
    • 另外,如果我将 for 循环更改为 while 并且一个从站在 while 中迭代 3 次,另外 5 次,另外 12 次,该怎么办。它会陷入僵局,是吗?我该如何预防?
    • 是的,它会死锁。问题变成了,你为什么要首先同步?
    • 因为我在每一步都需要来自其他处理器的更新信息。我的算法中需要它。
    • 你可以简单地让你们所有的奴隶迭代多次,并简单地检查当前迭代是否小于它们各自的最大值。在if 语句结束后,您添加MPI_Barrier()。这有点浪费资源,但前提是进程可以做其他事情。至少,它会起作用,您将能够评估是否需要从那里进一步优化。
    猜你喜欢
    • 2021-06-04
    • 2017-06-07
    • 2021-05-14
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多