c openmp平行于平行区域内

Pin*_*oyd 1 c multithreading for-loop openmp

我的问题是这样的一个.但我想做点不同的事......

例如,在我的并行区域内,我想在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
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法将每个(4)运行线程"拆分"为两个(新)线程,因此在for循环中有更多(8)个线程正在运行?

Jon*_*rsi 5

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

要在注释中回答您的后续问题,在OpenMP并行for循环结束时不需要屏障; 除非您使用该nowait子句,否则在for循环结束时已经存在明确的同步障碍.你不能有一个屏障的for循环; 如果循环迭代没有被线程平均分配会发生什么?你最终会遇到一些线程被"卡住"等待其他线程无法进入的障碍.