2016-11-25 40 views
1

我有一個C++的OpenMP代碼看起來這一點:OMP屏障嵌套線程

#pragma omp parallel proc_bind(spread), num_threads(ncpu) 
{ 
    <some code> 
    #pragma omp parallel proc_bind(close), num_threads(ncore) 
    { 
     <some more code...> 
     #pragma omp barrier 
    }/* End of Level 2 threads*/ 
}/* End of Level 1 threads*/ 

這將創建2級嵌套螺紋(總共16個線程)。我的問題是我需要屏障來延伸兩層線程。因爲它現在是每個8線程的第2級羣組將等待其羣組成員,但是當一個羣組完成時,它將繼續前進,而不管其他8個線程的組。有沒有辦法建立一個在頂層運作的障礙? (沒有終止L2並行區域並重新創建它)

+0

對不起,只是在例子中忘了他們......我確實有他們在真正的代碼 – Joel

+0

,但如果總線程數爲100k,那麼在每個障礙處它們需要在它們之間的存儲器切換中保持10萬個堆棧。 –

回答

0

barrier指令只適用於當前的團隊,所以在這裏你的2級。如果真的終止該級別2是不是一種選擇,那麼我想這樣的事情可以工作:

int nbDone = 0; 
#pragma omp parallel proc_bind(spread), num_threads(ncpu) 
{ 
    <some code> 
    #pragma omp parallel proc_bind(close), num_threads(ncore) 
    { 
     <some more code...> 
     // here is the "inter-team barrier" 
     #pragma omp atomic update 
     ++nbDone; 
     bool allDone = false; 
     while (!allDone) { 
      #pragma omp barrier 
      #pragma omp atomic read 
      allDone = nbDone == ncpu * ncore; 
     } 
     // End of the "inter-team barrier" 
    }/* End of Level 2 threads*/ 
}/* End of Level 2 threads*/ 

我沒有測試過,但我認爲應該工作。不過,我仍然相信你最好只是完成你的L2球隊,把L放在L1並且回到你的L2球隊......