【发布时间】:2015-01-08 03:19:00
【问题描述】:
在我看来,可用于跨子例程保存全局变量的 fortran 模块在使用 OpenMP 时的工作方式不同。这是一个例子:
main.f90
program main
use mod
implicit none
!$OMP PARALLEL private(a)
!$OMP DO
do i=1,10
a=i-1
print*,"a =",a
call echo
print*,"b =",b
enddo
!$OMP END DO
!$OMP END PARALLEL
end program main
echo.f90
subroutine echo
use mod
implicit none
b=a+1
!print *,a,"+1=",b
end subroutine echo
mod.f90
module mod
integer:: i,a,b
end module mod
现在,如果你在没有 OpenMP 的情况下编译并运行它,你会得到:
a = 0
b = 1
a = 1
b = 2
a = 2
……等等。这是你所期望的
但是,如果你用 openMP 编译你会得到:
a = 7
b = 1
a = 6
b = 1
a = 8
……等等。这不是我想要的。我知道 echo 子例程从模块中获取“a”,而不是线程拥有的私有“a”。除了将其作为参数传递之外,还有什么方法可以做到这一点?我的模块中有大量变量,这会很乏味。
【问题讨论】:
-
如果您让
echo返回或分配b而不是共享它会怎样,因为它是一个仅取决于a的基本函数。我认为有几个线程正在同时修改b。