【问题标题】:Nested OpenMP parallel regions not iterating as expected嵌套的 OpenMP 并行区域未按预期迭代
【发布时间】:2017-09-23 04:45:23
【问题描述】:

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

我正在阅读 Miguel Hermanns 的“使用 OpenMP 在 Fortran 95 中进行并行编程”,并且我在这本书的早期阶段。早期示例之一显示了嵌套并行区域的使用,并表明它应该产生 N2 + N 行输出。过程如下:

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

我希望得到 12 个 Hello 和 144 个 His,但实际上我得到了 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 行输出?

【问题讨论】:

  • 为所有 Fortran 问题使用标签 fortran。您可以为特定于版本的问题添加版本标签(这根本不是特定于 Fortran 版本的问题)。甚至你引用的书也是 F95 而不是 F90...

标签: fortran openmp


【解决方案1】:

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

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

【讨论】:

  • 啊,好的,谢谢。如果我愿意,是否有一个标志告诉它在编写嵌套并行区域时运行它们?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多