2011-11-08 25 views
0

我有一段代碼OpenMP的代碼將等待加入屏障大部分時間

void parallel_func() 
{ 
#pragma omp parallel 
    { 
    #pragma omp for collapse(2) schedule(dynamic) nowait 
    for(i=0; i<N; i++) { 
     for(j=0;j<N;j++) { 
      if (i>j) continue; // hack to allow collapse here 
     //... 
     } 
    } 

    #pragma omp critical 
    { 
    //... 
    } 
    } 
} 

使用分析,我發現我的大部分代碼花費...在等待有關OpenMP 加入屏障時 ...任何想法爲什麼?或者如何找出原因?

回答

1
  1. 哪裏omp parallel?我假設parallel_func位於omp parallel部分。

  2. 目前還不清楚,因爲您沒有說哪個連接障礙會導致巨大的開銷。在你的代碼中,omp for確實有nowait,這意味着沒有隱含的障礙。你有omp critical。這實際上是一個關鍵部分,所以這不會進行屏障操作。 (如果omp single,然後加入需要屏障,除非omp single nowait

  3. 所以,只是懷疑的地方加入屏障與omp parallel部分,這是不是在你的代碼中顯示的。如果parallel_func到底是結束在omp parallel節,和你的omp parallel沒有nowait的,那麼連接屏障與parallel_func結束。

  4. 最後,如何找出原因?這主要是因爲工作量不平衡的。工作的量每個線程可能會有太大的偏差,這會讓一些線程在隱式連接障礙上浪費時間ase標識工作負載分佈。

+0

感謝您的回答。我加了'並行'。我使用了VTune,並且我注意到_all_線程在最後是空閒的,所以它很奇怪。我也刪除了幾乎所有的代碼,並且我得到了同樣的效果。也許它是由VTune添加的一些工件... –