在openmp中,默认情况下fortran子例程中的局部变量是私有的吗?

时间:2013-10-12 01:50:16

标签: fortran openmp fortran90

对OpenMP中的私有和共享变量的基本疑问。代码看起来如下。数组 arr 包含1到10之间的变量,它是全局的。

PROGRAM TEST
IMPLICIT NONE
INTEGER :: i,j
DO i=1,10
   call check()
END DO
END PROGRAM TEST

SUBROUTINE CHECK()
IMPLICIT NONE
INTEGER :: testvar,i
!$OMP PARALLEL DO
DO i = 1,10
   testvar = a(i)-1
   print testvar
END DO
!$END PARALLEL DO
END SUBROUTINE CHECK

问题:默认情况下,子例程的本地变量testvar是私有的吗?这里的一个主要区别是!$OMP PARALLEL仅在子例程内部启动,因此这不是孤立的指令。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

在Fortran中,循环的索引变量会自动变为私有。所有其他变量都是共享

如果从并行区域调用subroutine,则该子例程中的 local 变量也是该线程专用的。

回答你的问题:虽然testvar是子程序的本地,但所有线程都是 shared ,因为并行部分也位于子程序中。如果将并行部分移动到主程序,然后调用子程序,则会有所不同。