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

我使用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; jj) { 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.7s(开销= 40%)

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

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

谢谢。

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

话虽这么说,你的代码包含一个嵌套在外部循环内的并行区域。 这意味着进入和退出并行区域的开销乘以N倍。 这只有在N相对较小且CN大得多(比数量级大)的情况下才有意义,因此在该区域内完成的工作大大超过了OpenMP开销。