主题:Fortran + OpenMP 的问题,串并行结果不同。
以下这段代码,串行和使用OpenMP执行的结果不同,大家看看我这样使用OpenMP有没有什么问题吗?
数组全部是共享的,因为多个线程操作的是数组的不同部分,所以应该没有问题吧。谢谢了。
!$OMP PARALLEL PRIVATE(temp)
!$OMP DO
DO K=1,KMAX
DO J=2,JMAX
DO I=2,IMAX
temp=
& (.25E0*(DT(I-1,J)+DT(I,J))*(DY(I,J)+DY(I-1,J))*U(I,J,K))*DZ(K)
Array_1(I,J,K) = temp
IF (U(I,J,K)>=0.) THEN
XArray(I,J,K) = temp*F(I-1,J,K)
ELSE
XArray(I,J,K) = temp*F(I,J,K)
ENDIF
temp=
& (.25E0*(DT(I,J-1)+DT(I,J))*(DX(I,J)+DX(I,J-1))*V(I,J,K))*DZ(K)
Array_2(I,J,K)= temp
IF(V(I,J,K)>=0.) THEN
YArray(I,J,K) = temp*F(I,J-1,K)
ELSE
YArray(I,J,K) = temp*F(I,J,K)
ENDIF
IF(K>1) THEN
temp = DX(I,J)*DY(I,J)*W(I,J,K)
Array_3(I,J,K) = temp
IF( W(I,J,K) >= 0.) THEN
ZArray(I,J,K) = temp*F(I,J,K)
ELSE
ZArray(I,J,K) = temp*F(I,J,K-1)
ENDIF
ENDIF
ENDDO
ENDDO
ENDDO
!$OMP END DO
!$OMP END PARALLEL
数组全部是共享的,因为多个线程操作的是数组的不同部分,所以应该没有问题吧。谢谢了。
!$OMP PARALLEL PRIVATE(temp)
!$OMP DO
DO K=1,KMAX
DO J=2,JMAX
DO I=2,IMAX
temp=
& (.25E0*(DT(I-1,J)+DT(I,J))*(DY(I,J)+DY(I-1,J))*U(I,J,K))*DZ(K)
Array_1(I,J,K) = temp
IF (U(I,J,K)>=0.) THEN
XArray(I,J,K) = temp*F(I-1,J,K)
ELSE
XArray(I,J,K) = temp*F(I,J,K)
ENDIF
temp=
& (.25E0*(DT(I,J-1)+DT(I,J))*(DX(I,J)+DX(I,J-1))*V(I,J,K))*DZ(K)
Array_2(I,J,K)= temp
IF(V(I,J,K)>=0.) THEN
YArray(I,J,K) = temp*F(I,J-1,K)
ELSE
YArray(I,J,K) = temp*F(I,J,K)
ENDIF
IF(K>1) THEN
temp = DX(I,J)*DY(I,J)*W(I,J,K)
Array_3(I,J,K) = temp
IF( W(I,J,K) >= 0.) THEN
ZArray(I,J,K) = temp*F(I,J,K)
ELSE
ZArray(I,J,K) = temp*F(I,J,K-1)
ENDIF
ENDIF
ENDDO
ENDDO
ENDDO
!$OMP END DO
!$OMP END PARALLEL