主题:请教这两段程序如何使用openmp并行化
第一部分:
!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(FLUXRES,ALL_LENTH,TMP,K,KK)
DO I = 1, numNODE
FLUXRES = 0.0_SP
ALL_LENTH= 0.0_SP
TMP = 0.0_SP
DO K = 1, NODES(I)%ICC
KK = NODES(I)%IDC(K)
TMP = SQRT((CELLS(KK)%XC - NODES(I)%X)**2 + (CELLS(KK)%YC - NODES(I)%Y)**2)
FLUXRES = FLUXRES + CellVAR(KK)/TMP
ALL_LENTH= ALL_LENTH + 1.0_SP/TMP
ENDDO
NodeVAR(I) = FLUXRES/ALL_LENTH
END DO
!$OMP END PARALLEL DO
!!!!!!!
我自己的做法我觉得是错误,关键是FLUXRES的处理: 本身FLUXRES在i循环中可以作为一个私有变量 但是在k循环中它必须是公有的且需要做reduction操作
第二部分
!$OMP PARALLEL DO &
!$OMP& DEFAULT(SHARED) &
!$OMP& PRIVATE(IA,IB,COS_SITA,SIN_SITA,DNL,DNR, &
!$OMP FLUX_LR,I1) REDUCTION(+: XFLUX,XADV,YADV,S0U,S0V)
DO I=1,numFACE
IA=FACES(I)%CV_L
IB=FACES(I)%CV_R
COS_SITA = FACES(I)%DLTY/FACES(I)%LENTH
SIN_SITA =-FACES(I)%DLTX/FACES(I)%LENTH
!
FLUX_LR(1) = ROEFLUXN(1)*FACES(I)%LENTH
FLUX_LR(2) = (ROEFLUXN(2)*COS_SITA - ROEFLUXN(3)*SIN_SITA)*FACES(I)%LENTH
FLUX_LR(3) = (ROEFLUXN(2)*SIN_SITA + ROEFLUXN(3)*COS_SITA)*FACES(I)%LENTH
!
XFLUX(IA) = XFLUX(IA) + FLUX_LR(1)
XADV(IA) = XADV(IA) + FLUX_LR(2)
YADV(IA) = YADV(IA) + FLUX_LR(3)
S0U(IA) = S0U(IA) + DNL*DNL*FACES(I)%DLTY
S0V(IA) = S0V(IA) - DNL*DNL*FACES(I)%DLTX
!
XFLUX(IB) = XFLUX(IB) - FLUX_LR(1)
XADV(IB) = XADV(IB) - FLUX_LR(2)
YADV(IB) = YADV(IB) - FLUX_LR(3)
S0U(IB) = S0U(IB) - DNR*DNR*FACES(I)%DLTY
S0V(IB) = S0V(IB) + DNR*DNR*FACES(I)%DLTX
ENDDO
!$OMP END PARALLEL DO
这段也有问题 做规约操作的时候我为了同样使用加操作
S0V(IA) = S0V(IA) - DNL*DNL*FACES(I)%DLTX
改成了 S0V(IA) = S0V(IA) + DNL*DNL*FACES(I)%DLTX*-1.0
但是运算起来结果还是与单线程相比出错了 请指点下我 谢谢
!$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(FLUXRES,ALL_LENTH,TMP,K,KK)
DO I = 1, numNODE
FLUXRES = 0.0_SP
ALL_LENTH= 0.0_SP
TMP = 0.0_SP
DO K = 1, NODES(I)%ICC
KK = NODES(I)%IDC(K)
TMP = SQRT((CELLS(KK)%XC - NODES(I)%X)**2 + (CELLS(KK)%YC - NODES(I)%Y)**2)
FLUXRES = FLUXRES + CellVAR(KK)/TMP
ALL_LENTH= ALL_LENTH + 1.0_SP/TMP
ENDDO
NodeVAR(I) = FLUXRES/ALL_LENTH
END DO
!$OMP END PARALLEL DO
!!!!!!!
我自己的做法我觉得是错误,关键是FLUXRES的处理: 本身FLUXRES在i循环中可以作为一个私有变量 但是在k循环中它必须是公有的且需要做reduction操作
第二部分
!$OMP PARALLEL DO &
!$OMP& DEFAULT(SHARED) &
!$OMP& PRIVATE(IA,IB,COS_SITA,SIN_SITA,DNL,DNR, &
!$OMP FLUX_LR,I1) REDUCTION(+: XFLUX,XADV,YADV,S0U,S0V)
DO I=1,numFACE
IA=FACES(I)%CV_L
IB=FACES(I)%CV_R
COS_SITA = FACES(I)%DLTY/FACES(I)%LENTH
SIN_SITA =-FACES(I)%DLTX/FACES(I)%LENTH
!
FLUX_LR(1) = ROEFLUXN(1)*FACES(I)%LENTH
FLUX_LR(2) = (ROEFLUXN(2)*COS_SITA - ROEFLUXN(3)*SIN_SITA)*FACES(I)%LENTH
FLUX_LR(3) = (ROEFLUXN(2)*SIN_SITA + ROEFLUXN(3)*COS_SITA)*FACES(I)%LENTH
!
XFLUX(IA) = XFLUX(IA) + FLUX_LR(1)
XADV(IA) = XADV(IA) + FLUX_LR(2)
YADV(IA) = YADV(IA) + FLUX_LR(3)
S0U(IA) = S0U(IA) + DNL*DNL*FACES(I)%DLTY
S0V(IA) = S0V(IA) - DNL*DNL*FACES(I)%DLTX
!
XFLUX(IB) = XFLUX(IB) - FLUX_LR(1)
XADV(IB) = XADV(IB) - FLUX_LR(2)
YADV(IB) = YADV(IB) - FLUX_LR(3)
S0U(IB) = S0U(IB) - DNR*DNR*FACES(I)%DLTY
S0V(IB) = S0V(IB) + DNR*DNR*FACES(I)%DLTX
ENDDO
!$OMP END PARALLEL DO
这段也有问题 做规约操作的时候我为了同样使用加操作
S0V(IA) = S0V(IA) - DNL*DNL*FACES(I)%DLTX
改成了 S0V(IA) = S0V(IA) + DNL*DNL*FACES(I)%DLTX*-1.0
但是运算起来结果还是与单线程相比出错了 请指点下我 谢谢