模块内的私有变量和 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
tid
和 global
是私有的还是共享的?
非常感谢任何帮助!
模块变量在 OpenMP 中总是 shared
,除非您使用 threadprivate
指令。有关 threadprivate
的详细说明,请参阅 Difference between OpenMP threadprivate and private。所以global
将被分享。
局部变量tid
在子程序中声明并从并行区域调用。因此它将是 private
除非它具有 save
属性。
(请注意,像 integer :: tid = 0
这样的初始化也会隐式添加 save
,所以要小心。)
我正在尝试并行化用于油田计算的相当复杂的模拟代码。
我的问题是,如果我可以在一个模块中声明一个变量或一些可分配数组和一些子例程,然后在另一个包含并行区域的 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
tid
和 global
是私有的还是共享的?
非常感谢任何帮助!
模块变量在 OpenMP 中总是 shared
,除非您使用 threadprivate
指令。有关 threadprivate
的详细说明,请参阅 Difference between OpenMP threadprivate and private。所以global
将被分享。
局部变量tid
在子程序中声明并从并行区域调用。因此它将是 private
除非它具有 save
属性。
(请注意,像 integer :: tid = 0
这样的初始化也会隐式添加 save
,所以要小心。)