回 帖 发 新 帖 刷新版面

主题:请教这两段程序如何使用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

但是运算起来结果还是与单线程相比出错了 请指点下我 谢谢

回复列表 (共1个回复)

沙发

对了 第二部分中间调用过子程序 并从子程序中调用过值 并行里面调用子程序是一个怎么样的过程 

!$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
!
      CALL SUB1(DNL,DNR)

        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

我来回复

您尚未登录,请登录后再回复。点此登录或注册