c++ - openMPI 会导致双 Hexacore 机器出现性能问题吗?

标签 c++ performance parallel-processing mpi openmpi

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

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

  • NP 24:3.1 分钟(全 HT)

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

有解决办法吗?

最佳答案

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

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

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

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

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

关于c++ - openMPI 会导致双 Hexacore 机器出现性能问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33389314/

相关文章:

java - 为什么使用parallelStream访问和修改Collection会得到不同的结果?

c++ lambda,无法访问拷贝捕获的变量

c++ - 通过 HTTP 代理使用 boost::asio(同步调用)在 HTTPS TLS 握手上出现流截断错误

android,面向对象编程与性能设计

performance - 比较 druid 和 pipelinedb

c - 使用 openmp 的段错误(核心转储)

C++如何在不复制数据的情况下添加和到数组?

c++ - 模板类成员的初始化可以委托(delegate)给客户端吗?

c# - WCF cometd 和线程

java - 在线程之间共享资源,不同 java 版本中的不同行为