[英]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.