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

时间:2016-09-20 14:46:49

标签: c++ multithreading gcc openmp

所以,我有现有的代码,其中几个指令通过简单的

并行化
#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的行为类似的任何提示......

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

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

  • 每条指令的单核处理时间约为5毫秒,因此运行速度非常快。
  • 指令(A,B,C)是在彼此之后计算的
  • 在开始B之前,执行等待所有As完成等等(在C开始之前,所有B都必须完成)
  • 对于每条指令,并行计算3个SIMD线程(例如A1,A2,A3)
  • 每条指令A,B,C依赖于其前任的数据(例如B1使用来自A1的数据,但没有来自任何&#34; 2&#34;或&#34; 3&#34;指令的数据,其中< em>应该在不同的核心上运行)

我想要的是核心方式的绑定,以便

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

1 个答案:

答案 0 :(得分:0)

经过长时间的调试并尝试找出问题,我能够解决它:

是OpenMP的问题,但与硬件有关。操作系统显然降低了CPU频率(从3900MHz到1200MHz)甚至,而正在运行。当我在BIOS中禁用所有CPU省电设置时,该过程以预期的速度运行。仅供参考:英特尔i7-5930K,华硕X99-E WS。