omp障碍嵌套线程

时间:2016-11-25 13:36:22

标签: multithreading openmp

我有一个c ++ OpenMP代码,可以看到这个:

#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个线程)。我的问题是我需要屏障来扩展两个线程层。现在,每个Level 2组的8个线程将等待其组成员,但是当一个组完成时,它将继续运行,而不管其他8个线程组。有没有办法创建一个在顶层运行的障碍? (不终止L2并行区域并重新创建它)

1 个答案:

答案 0 :(得分: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团队,在L1上放一个barrier并回到你的L2团队......