嵌套的OpenMP并行区域未按预期迭代

时间:2017-09-22 19:11:54

标签: fortran openmp

这可能是一个愚蠢的问题,但由于数据量的增加,我刚刚开始使用OpenMP。

我正在使用OpenMP"在Fortran 95中进行并行编程。米格尔·赫曼斯(Miguel Hermanns),我很早就读到这本书。其中一个早期的例子显示了嵌套平行区域的使用,并表明它应该产生N 2 + N行输出。程序如下:

program helloworld
    !$OMP PARALLEL
        write(*,*) "Hello"
        !$OMP PARALLEL
            write(*,*) "Hi"
        !$OMP END PARALLEL
    !$OMP END PARALLEL
end program helloworldcode

我期待12个Hellos和144个他,但我得到12个:

$ ./helloworld.exe 
 Hello
 Hello
 Hello
 Hi
 Hi
 Hello
 Hello
 Hello
 Hello
 Hello
 Hello
 Hi
 Hi
 Hello
 Hello
 Hi
 Hi
 Hi
 Hi
 Hi
 Hello
 Hi
 Hi
 Hi

为什么我没有得到我期望的156行输出?

1 个答案:

答案 0 :(得分:0)

默认情况下,OpenMP序列化所有嵌套的并行区域,以防止在创建N ^ 2个工作线程时出现二次超额预订的最坏情况。如果处理器数量足够多(比如> = 16),则二次超额预订可能会破坏执行的噩梦开销,或者在无法创建请求的线程数时导致资源耗尽问题。

有关如何在OpenMP中启用嵌套并行性的风险,请参阅omp_set_nested和相应的环境变量OMP_NESTED