我有一个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并行区域并重新创建它)
答案 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团队......