【问题标题】:What control MPI_Barrier time to execute什么控制 MPI_Barrier 执行时间
【发布时间】:2015-07-14 09:49:58
【问题描述】:

这段代码:

#include <mpi.h>

int main(int argc, char* argv[])
{
    MPI_Init(&argc, &argv);

    for (unsigned int iter = 0 ; iter < 1000 ; iter++)
        MPI_Barrier(MPI_COMM_WORLD);

    MPI_Finalize();

    return 0;
}

使用MPICH 3.1.4 运行时间很长。以下是不同 MPI 实现的挂钟(以秒为单位)。

在具有 4 个处理器和 2 个 cpu 内核的笔记本电脑上:

| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.01          | 0.39          | 0.01        |
|  4       | 0.02          | 0.39          | 0.01        |
|  8       | 0.14          | 0.45          | 27.28       |
| 16       | 0.34          | 0.53          | 71.56       |

在具有 4 个 CPU 核心的 8 个处理器的桌面上:

| MPI size | MPICH 1.4.1p1 | openmpi 1.8.4 | MPICH 3.1.4 |
|----------|---------------|---------------|-------------|
|  2       | 0.00          | 0.41          | 0.00        |
|  4       | 0.01          | 0.41          | 0.01        |
|  8       | 0.07          | 0.45          | 2.57        |
| 16       | 0.36          | 0.54          | 61.76       |

什么解释了这种差异,以及如何控制它?

【问题讨论】:

  • 您在什么样的硬件设置上运行它? 4核很可能在同一个节点上,所以MPI实现可以在没有网络通信的情况下同步进程。
  • 我已经编辑了问题以提供数量和核心,以及另一台机器上的时间
  • 你所说的“8 个处理器的 4 个 cpu”是什么意思?超线程?如果是,那么它们就不是真正的处理器,你不能指望它们能完全加速。
  • MPICH 在这些版本之间的某个时间点从 ch3:sock over TCP 切换到 ch3:nemesis。后者具有需要忙等待的共享内存优化,这在超额订阅的情况下不会扩展。如果您使用 ch3:sock 构建,您将恢复之前的行为。
  • 你应该只对障碍物计时。我怀疑 Init 的时间是 MPICH 和 OpenMPI 之间的主要区别,除了超额订阅的情况。

标签: mpi openmpi mpich


【解决方案1】:

您正在使用MPI size > 可用的处理器数量。由于 MPI 程序以每个进程由单个处理器处理的方式生成,这意味着,例如,当您在 8 核机器上运行 MPI size == 16 时,每个处理器将负责两个进程;这不会使程序变得更快,事实上,正如您所见,它会使其变慢。解决这个问题的方法是要么让机器拥有更多可用处理器,要么确保你在运行代码时使用MPI size

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 2021-06-09
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多