c openmp parallel for inside a parallel region

问题描述 投票:3回答:2

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

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

c multithreading for-loop openmp
2个回答
8
投票

你这里有什么 - 嵌套并行大多数当前支持OpenMP的编译器都支持这种方式,但通常默认情况下是关闭的。你需要将 OMP_NESTED 环境变量,以 TRUE或在你的程序中调用 omp_set_nested(1). 见,例如。本回答.

为了回答你在评论中的后续问题,你不需要在OpenMP并联的末端为循环设置障碍;除非你使用了 nowait 条款的最后,已经有了一个隐性的同步障碍。for 循环。 你不能有一个障碍 里面 for 循环;如果循环迭代不是按线程平均分配会怎样? 你会导致一些线程被 "卡 "在一个其他线程都无法到达的障碍上。


1
投票

是的,正确的做法是你选择的方法:第二个for循环将被每4个线程分割,这样8个线程 同时执行最里面的循环。

© www.soinside.com 2019 - 2024. All rights reserved.