这可能是一个愚蠢的问题,但由于数据量的增加,我刚刚开始使用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行输出?
答案 0 :(得分:0)
默认情况下,OpenMP序列化所有嵌套的并行区域,以防止在创建N ^ 2个工作线程时出现二次超额预订的最坏情况。如果处理器数量足够多(比如> = 16),则二次超额预订可能会破坏执行的噩梦开销,或者在无法创建请求的线程数时导致资源耗尽问题。
有关如何在OpenMP中启用嵌套并行性的风险,请参阅omp_set_nested和相应的环境变量OMP_NESTED。