2

对 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仅在子程序内部开始,因此这不是孤立指令。任何帮助是极大的赞赏。

4

1 回答 1

4

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

如果subroutine从并行区域调用 a,则该子例程中的局部变量也是线程私有的。

回答您的问题:虽然testvar是子例程的本地,但它为所有线程共享,因为并行部分也位于子例程中。如果将并行部分移至主程序,然后调用子程序,情况会有所不同。

于 2013-10-12T08:05:55.050 回答