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

时间:2014-02-24 21:48:25

标签: c performance openmp

我使用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

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

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

有人可以解释这种行为背后的原因。

感谢。

1 个答案:

答案 0 :(得分:5)

启用OpenMP会禁止某些编译器优化,例如它可以防止循环被矢量化或共享变量保存在寄存器中。因此,支持OpenMP的代码通常比串行代码慢,并且必须利用可用的并行性来抵消这种情况。

话虽如此,您的代码包含嵌套在外部循环内的并行区域。这意味着进入和退出并行区域的开销乘以 N 次。这只有在 N 相对较小并且 C N 大得多(比数量级更大)时才有意义,因此正在完成的工作在该区域内部大大超过了OpenMP开销。