【问题标题】:can openMPI cause performance problems on dual Hexacore machine?openMPI 会导致双 Hexacore 机器上的性能问题吗?
【发布时间】:2016-01-28 02:58:29
【问题描述】:

我的电脑有 2 个 Intel® Xeon® 处理器 X5650,每个处理器有 6 个内核,并且支持 HT。但是当我运行 MPI 代码时,它不会超过 6 倍的加速。 以下是一些当前的运行时间:

  • NP 1:20 分钟
  • NP 6:4 分钟
  • NP 12:3.5 分钟

  • NP 24:3.1 分钟(全 HT)

所以在 6 个启动进程之前,它会按计划运行。所有核心都处于活动状态,运行时间减少是线性的。 与 OpenMP 相同。 这可能是由于机器上的缓存不一致吗? 有一天我在 MPI 会议上听说了它。

有解决办法吗?

【问题讨论】:

  • mpirun 中使用的邮政编码和关联选项。

标签: c++ performance parallel-processing mpi openmpi


【解决方案1】:

简而言之,是的,但这是特定于问题的 - 一些应用程序根本不会随内核数量线性扩展,这有很多原因(例如,您的应用程序中线程/数据级并行性不足)。事实上,根据我的经验,除了令人尴尬的并行应用程序(例如 Monte Carol 模拟?)之外,您很难找到与内核数量完美扩展的应用程序。在不分析应用程序的情况下,任何人都不太可能给你一个准确的答案,因为亚线性缩放有很多可能的原因。

但是,就您而言,最明显的问题可能是由超线程 (HT) 引起的。您展示的最违反直觉的结果是,从 12 个线程变为 24 个线程(即在最大程度使用超线程时)几乎不会导致加速。在某些情况下,HT 不会导致性能提升。这是典型的情况:

  1. 运行充分利用 CPU 算术单元的应用程序。例如,请参阅this
  2. 当每个线程有大量来自主内存的 I/O(例如)时(换句话说,如果您的应用程序变得内存受限)。您可以使用roofline model 查看您的应用程序是否受内存或计算限制。

这是因为最终 HT 是通过在 CPU 内核上运行的线程之间共享 CPU 内核中的许多执行单元来工作的。例如,如果每个内核都有一个浮点单元,该单元由在该内核上运行的所有线程共享,那么无论您使用多少线程,每个时钟周期都不能执行多个浮点操作。为了调查这是否是原因,我建议禁用 HT(因为甚至可能存在性能开销)。 Unix 机器上通常有一个内核启动选项来禁用 HT。

最后,另一个典型问题是双插槽机器通常是(?)NUMA 机器。这意味着从不同的 CPU 访问相同的内存内容可能需要不同的时间。所以你的实现应该是 NUMA 感知的。

【讨论】:

  • 原来程序的一部分不知道numa。另一部分完美地扩展到 12 个处理器。谢谢提示
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 2017-04-02
相关资源
最近更新 更多