繁体   English   中英

OpenMP的1个线程比顺序版本慢

[英]OpenMP with 1 thread slower than sequential version

我已经使用OpenMP(gcc版本4.6.3)实现了背包

#define MAX(x,y)   ((x)>(y) ? (x) : (y))
#define table(i,j)    table[(i)*(C+1)+(j)]

   for(i=1; i<=N; ++i) {
#pragma omp parallel for
      for(j=1; j<=C; ++j) {
         if(weights[i]>j) {
            table(i,j) = table(i-1,j);
         }else {
            table(i,j) = MAX(profits[i]+table(i-1,j-weights[i]), table(i-1,j));
         }
      }
   }

顺序程序的执行时间= 1s

1个线程的openmp的执行时间= 1.7秒(开销= 40%)

两种情况下都使用相同的编译器优化标志(-O3)。

有人可以解释这种现象背后的原因。

谢谢。

启用OpenMP会抑制某些编译器的优化,例如,它可以防止对循环进行矢量化处理或将共享变量保留在寄存器中。 因此,启用OpenMP的代码通常比串行代码慢,并且必须利用可用的并行性来弥补这一问题。

就是说,您的代码包含一个嵌套在外部循环内的并行区域。 这意味着进入和离开并行区域的开销将增加N倍。 此才有意义,如果N是相对小的,而C是显著较大(如幅度大几个数量级),比N,因此工作被该区域内部完成大大胜过OpenMP的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM