簡體   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