我正在尝试并行化用于油田计算的相当复杂的模拟代码。
我的问题是,如果我可以在一个模块中声明一个变量或一些可分配的数组和一些子程序,那么在另一个包含并行区域的模块/子程序中使用该模块,这些变量和数组是否会被认为是私有的线程(即它们将具有这些变量的单独副本,并且线程中的变量所做的更改将不被其他线程看到)或者它们将被共享?
像这样:
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
是私有还是共享?
非常感谢任何帮助!
答案 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}">
,所以要小心。)