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

时间:2016-08-01 16:26:50

标签: multithreading parallel-processing fortran openmp fortran90

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

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

像这样:

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是私有还是共享?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

除非您使用shared指令,否则OpenMP中的模块变量始终为 threadprivate 。有关threadprivate的详细说明,请参阅Difference between OpenMP threadprivate and private。因此global将被分享。

局部变量tid在子例程中声明,并从并行区域调用。因此,除非private属性具有save ,否则它将为 integer :: tid = 0

(请注意,像save这样的初始化也会隐式添加<body ng-init="user=${userID};month=${month};curPageNum=${currentPage}"> ,所以要小心。)