我的问题是这样的one .但我想做一些不同的事情...
例如,在我的并行区域内,我想在 4 个线程上运行我的代码。当每个线程进入 for 循环时,我想在 8 个线程上运行我的代码。像
#pramga omp parallel num_threads(4)
{
//do something on 4 threads
#pragma omp parallel for num_threads(2)
for(int i=0;i<2;i++){
//do something on 8 threads in total
}
}
那么,有没有办法将每个 (4) 个正在运行的线程“拆分”为两个(新)线程,以便在 for 循环内运行更多 (8) 个线程?
这里有什么 - nested parallelism , 一个并行部分在另一个内部 - 大多数当前支持 OpenMP 的编译器都支持,但通常默认情况下关闭。您需要将 OMP_NESTED
环境变量设置为 TRUE
,或者在您的程序中调用 omp_set_nested(1)
。参见,例如 this answer .
要在评论中回答您的后续问题,您不需要在 OpenMP 并行 for 循环结束时设置障碍;除非你使用 nowait
clause ,在 for
循环的末尾已经存在同步的隐式障碍。而且你不能在 for 循环的内部设置障碍;如果循环迭代没有被线程平均分配会怎样?您最终会遇到一些线程“卡住”在等待其他线程无法到达的屏障。
我是一名优秀的程序员,十分优秀!