3

我的问题是这样。但我想做一些不同的事情...

例如,在我的并行区域内,我想在 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)个线程?

4

2 回答 2

10

大多数当前启用 OpenMP 的编译器都支持您在这里所拥有的 -嵌套并行性,一个并行部分位于另一个部分中,但通常默认情况下是关闭的。您需要将OMP_NESTED环境变量设置为TRUE,或在您的程序调用omp_set_nested(1)中。参见,例如,这个答案

要在评论中回答您的后续问题,您不需要在 OpenMP 并行 for 循环结束时设置障碍;除非您使用该nowait子句for,否则在循环结束时已经存在用于同步的隐式障碍。你不能在 for 循环中设置障碍;如果循环迭代没有被线程平均划分会发生什么?您最终会遇到一些线程“卡住”在障碍处等待其他线程无法到达的障碍。

于 2013-04-08T12:41:27.193 回答
1

是的,正确的方法是您选择的方法:第二个 for 循环将由每 4 个线程拆分,以便 8 个线程可以同时执行最内层循环。

于 2013-04-05T09:41:30.563 回答