对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
仅在子例程内部启动,因此这不是孤立的指令。非常感谢任何帮助。
答案 0 :(得分:4)
在Fortran中,循环的索引变量会自动变为私有。所有其他变量都是共享。
如果从并行区域调用subroutine
,则该子例程中的 local 变量也是该线程专用的。
回答你的问题:虽然testvar
是子程序的本地,但所有线程都是 shared ,因为并行部分也位于子程序中。如果将并行部分移动到主程序,然后调用子程序,则会有所不同。