我使用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)。
有人可以解释这种行为背后的原因。
感谢。
答案 0 :(得分:5)
启用OpenMP会禁止某些编译器优化,例如它可以防止循环被矢量化或共享变量保存在寄存器中。因此,支持OpenMP的代码通常比串行代码慢,并且必须利用可用的并行性来抵消这种情况。
话虽如此,您的代码包含嵌套在外部循环内的并行区域。这意味着进入和退出并行区域的开销乘以 N 次。这只有在 N 相对较小并且 C 比 N 大得多(比数量级更大)时才有意义,因此正在完成的工作在该区域内部大大超过了OpenMP开销。