c 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 } } 

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

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

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

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