2016-11-25 88 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球队......