所以,我有现有的代码,其中几个指令通过简单的
并行化#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的行为类似的任何提示......
我无法分享我的代码,因为它太大而且目前,我没有最小的例子我可以分析它,抱歉。
更新 这样的说明可能不是原因,因为它之前已经有效。我可以告诉你的是:
我想要的是核心方式的绑定,以便
Core 1 handles instruction A1 -> B1 -> C1
Core 2 handles instruction A2 -> B2 -> C2
Core 3 handles instruction A3 -> B3 -> C3
答案 0 :(得分:0)
经过长时间的调试并尝试找出问题,我能够解决它:
不是OpenMP的问题,但与硬件有关。操作系统显然降低了CPU频率(从3900MHz到1200MHz)甚至,而正在运行。当我在BIOS中禁用所有CPU省电设置时,该过程以预期的速度运行。仅供参考:英特尔i7-5930K,华硕X99-E WS。