模块内的私有变量和 public 变量以及 OpenMP 中的子例程

Private and public variables inside a module and a a subroutine in OpenMP

我正在尝试并行化用于油田计算的相当复杂的模拟代码。

我的问题是,如果我可以在一个模块中声明一个变量或一些可分配数组和一些子例程,然后在另一个包含并行区域的 module/subroutine 中使用这个模块,这些变量和数组是否被认为对每个线程都是私有的(即它们将拥有这些变量的单独副本,并且对一个线程中的变量所做的更改不会被其他线程看到)或者它们将被共享?

像这样:

module m2
implicit none
integer :: global
contains

    subroutine s2()
        implicit none
        integer :: tid
        tid = ! Some calculation
    end subroutine s2
end module m2

module m1
    use m2
    implicit none
contains
    subroutine s1
        !$omp parallel do
            do i=1, 9
                call s2()
            end do
        !$omp end parallel do
    end subroutine s1
end module m1

tidglobal 是私有的还是共享的?

非常感谢任何帮助!

模块变量在 OpenMP 中总是 shared,除非您使用 threadprivate 指令。有关 threadprivate 的详细说明,请参阅 Difference between OpenMP threadprivate and private。所以global将被分享。

局部变量tid在子程序中声明并从并行区域调用。因此它将是 private 除非它具有 save 属性。

(请注意,像 integer :: tid = 0 这样的初始化也会隐式添加 save,所以要小心。)