关于fortran中的openmp,我对这个问题感到非常困惑。具体来说,当我这样编写程序时:
PROGRAM TEST
IMPLICIT NONE
INTEGER :: i,j,l
INTEGER :: M(2,2)
i=2
j=2
l=41
!$OMP PARALLEL SHARED(M),PRIVATE(l,i,j)
!$OMP DO
DO i=1,2
DO j=1,2
DO l=0,41
M(i,j)=M(i,j)+1
ENDDO
ENDDO
ENDDO
!$OMP END DO
!$OMP END PARALLEL
END PROGRAM TEST
通过: 编译后ifort -openmp test.f90
,运行良好,结果M(1,1)
为 42 符合预期。
但是,当我只调整 suml
和的顺序时{i,j}
,如下所示:
PROGRAM TEST
IMPLICIT NONE
INTEGER :: i,j,l
INTEGER :: M(2,2)
i=2
j=2
l=41
!$OMP PARALLEL SHARED(M),PRIVATE(l,i,j)
!$OMP DO
DO l=0,41
DO i=1,2
DO j=1,2
M(i,j)=M(i,j)+1
ENDDO
ENDDO
ENDDO
!$OMP END DO
!$OMP END PARALLEL
END PROGRAM TEST
通过: 编译后ifort -openmp test.f90
,效果不好。事实上,当你多次运行 a.out 时,结果M(1,1)
似乎是随机的。有谁知道是什么问题?另外,如果我想获得正确的结果,请按照求和顺序:
DO l=0,41
DO i=1,2
DO j=1,2
我应该修改这段代码的哪一部分?
非常感谢您的帮助。