gpt4 book ai didi

c++ - 使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:35 31 4
gpt4 key购买 nike

所以,我有现有的代码,其中几条指令通过简单地使用并行化

#pragma omp parallel for schedule( static, 1 )
[instruction set A with 4 instructions -> 4 threads]

#pragma omp parallel for schedule( static, 1 )
[instruction set B with 4 instructions -> 4 threads]

#pragma omp parallel for schedule( static, 1 )
[instruction set C with 4 instructions -> 4 threads]

代码在 4 核 i5 机器上执行得非常快,CPU 核心使用率几乎一直是 100%。

线程的调度很好,即:

Core 1 handles instruction A1 -> B1 -> C1
Core 2 handles instruction A2 -> B2 -> C2
Core 3 handles instruction A3 -> B3 -> C3

这是——恕我直言——很重要,因为例如B1指令依赖于A1指令的数据等。

但是,我有一台新机器(配备更快的 6 核 CPU),但程序执行速度较慢。

我目前最好的办法是,在这种情况下,调度效果不佳。

因为我也将编译器从 gcc 4.8.4 更改为 4.9.2,隐含的 OpenMP 从 3.1 更改为 4.0 和 4.0 的默认调度设置可能是调度问题的原因 (?)。

有没有办法像 OpenMP3.1 那样配置 OpenMP 4.0?我发现例如

GOMP_CPU_AFFINITY
OMP_PROC_BIND
OMP_PARTS
...

我只是没有找到任何关于如何使 4.0 和 3.1 的行为相似的提示......

我无法分享我的代码,因为它太大了,而且目前,我没有可以分析它的最小示例,抱歉。

更新:这样的说明可能不是原因,因为它以前有效。我可以告诉你的是:

  • 每条指令需要大约 5ms 的单核处理时间,因此它们的运行速度非常快。
  • 指令(A、B、C)是依次计算的
  • 在开始 B 之前,执行等待所有 A 完成,等等(在 C 开始之前,所有 B 必须完成)
  • 对于每条指令,并行计算 3 个 SIMD 线程(例如 A1、A2、A3)
  • 每条指令 A、B、C 都依赖于它们之前的数据(例如 B1 使用 A1 的数据,但没有来自任何“2”或“3”指令的数据,应该在不同的指令上运行核心)

我想要的是一个核心绑定(bind)

Core 1 handles instruction A1 -> B1 -> C1
Core 2 handles instruction A2 -> B2 -> C2
Core 3 handles instruction A3 -> B3 -> C3

最佳答案

经过长时间的调试并尝试找出问题所在,我能够修复它:

这不是 OpenMP 的问题,而是硬件的问题。操作系统明显降低了 CPU 频率(从 3900MHz 到 1200MHz),即使进程正在运行也是如此。当我在 BIOS 中禁用所有 CPU 节能设置时,进程以预期的速度运行。仅供引用:英特尔 i7-5930K、华硕 X99-E WS。

关于c++ - 使用 OpenMP 4.0 (gcc 4.8.4) 而不是 OpenMP 3.1 (gcc 4.9.2) 时速度会降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39597197/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com