From 01b48e736e40d3f2cc3bf8224d31f5221c0a6242 Mon Sep 17 00:00:00 2001 From: ESCOBAR Juan <escj@nuwa.aerologie.net> Date: Wed, 30 Oct 2013 11:11:11 +0100 Subject: [PATCH] Juan 301/10/2013: convert from PgiAcc/region to OpenAcc/kernels directive & test some loop vector(24) sheduling --- MNH/ppm.f90 | 194 +++++++++++++++++++++++++++------------------------- 1 file changed, 102 insertions(+), 92 deletions(-) diff --git a/MNH/ppm.f90 b/MNH/ppm.f90 index 6c8e4bd35..81cab3b7e 100644 --- a/MNH/ppm.f90 +++ b/MNH/ppm.f90 @@ -219,10 +219,7 @@ USE MODD_PARAMETERS, ONLY : JPHEXT USE MODE_MNH_ZWORK, ONLY : & & IIB,IIE, IIU,IJU,IKU , IJS,IJN, & & GWEST,GEAST, & -& ZQL=>ZW3D1,ZQR=>ZW3D2,ZDQ=>ZW3D3,ZQ6=>ZW3D4,ZDMQ=>ZW3D5 , & -& ZQL0=>ZW3D6,ZQR0=>ZW3D7,ZQ60=>ZW3D8 , & -& ZFPOS=>ZW3D9,ZFNEG=>ZW3D10 - +& ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG ! IMPLICIT NONE ! @@ -300,22 +297,33 @@ CALL GET_HALO_D(PSRC,HDIR="01_X") ! #define JUAN_ACC_01_X #ifdef JUAN_ACC_01_X -!$acc region +!$acc kernels #endif -DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU -PR(I,J,K)=PSRC(I,J,K) -ZQL(I,J,K)=PSRC(I,J,K) -ZQR(I,J,K)=PSRC(I,J,K) -ZDQ(I,J,K)=PSRC(I,J,K) -ZQ6(I,J,K)=PSRC(I,J,K) -ZDMQ(I,J,K)=PSRC(I,J,K) -ZQL0(I,J,K)=PSRC(I,J,K) -ZQR0(I,J,K)=PSRC(I,J,K) -ZQ60(I,J,K)=PSRC(I,J,K) -ZFPOS(I,J,K)=PSRC(I,J,K) -ZFNEG(I,J,K)=PSRC(I,J,K) -ENDDO ; ENDDO ; ENDDO -! acc end region +!!$DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU +!!$PR(I,J,K)=PSRC(I,J,K) +!!$ZQL(I,J,K)=PSRC(I,J,K) +!!$ZQR(I,J,K)=PSRC(I,J,K) +!!$ZDQ(I,J,K)=PSRC(I,J,K) +!!$ZQ6(I,J,K)=PSRC(I,J,K) +!!$ZDMQ(I,J,K)=PSRC(I,J,K) +!!$ZQL0(I,J,K)=PSRC(I,J,K) +!!$ZQR0(I,J,K)=PSRC(I,J,K) +!!$ZQ60(I,J,K)=PSRC(I,J,K) +!!$ZFPOS(I,J,K)=PSRC(I,J,K) +!!$ZFNEG(I,J,K)=PSRC(I,J,K) +!!$ENDDO ; ENDDO ; ENDDO +PR=PSRC +ZQL=PSRC +ZQR=PSRC +ZDQ=PSRC +ZQ6=PSRC +ZDMQ=PSRC +ZQL0=PSRC +ZQR0=PSRC +ZQ60=PSRC +ZFPOS=PSRC +ZFNEG=PSRC +! acc end kernels ! !------------------------------------------------------------------------------- ! @@ -438,9 +446,9 @@ ENDDO ; ENDDO ; ENDDO ! calculate dmq ! !! ZDMQ = DIF2X(PSRC) - ! acc region + ! acc kernels dif2x(ZDMQ,PSRC) - ! acc end region + ! acc end kernels ! ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary @@ -448,17 +456,17 @@ ENDDO ; ENDDO ; ENDDO ! WEST BOUND ! IF (GWEST) THEN - ! acc region + ! acc kernels ZDMQ(IIB-1,IJS:IJN,:) = -ZDMQ(IIB,IJS:IJN,:) - ! acc end region + ! acc end kernels ENDIF ! ! EAST BOUND ! IF (GEAST) THEN - ! acc region + ! acc kernels ZDMQ(IIE+1,IJS:IJN,:) = -ZDMQ(IIE,IJS:IJN,:) - ! acc end region + ! acc end kernels ENDIF ! ! monotonize the difference followinq eq. 5 in Lin94 @@ -482,10 +490,10 @@ ENDDO ; ENDDO ; ENDDO ! #define TEMPO_JUAN #ifdef TEMPO_JUAN -!$acc end region +!$acc end kernels CALL GET_HALO_D(ZDMQ,HDIR="01_X") CALL MPPDB_CHECK3DM("PPM::PPM_01_X OPEN ::ZDMQ",PRECISION,ZDMQ) -!$acc region +!$acc kernels #endif ! ! calculate qL and qR @@ -498,37 +506,39 @@ CALL MPPDB_CHECK3DM("PPM::PPM_01_X OPEN ::ZDMQ",PRECISION,ZDMQ) ! #ifdef TEMPO_JUAN -!$acc end region +!$acc end kernels CALL GET_HALO_D(ZQL0,HDIR="01_X") -!$acc region +!$acc kernels #endif ! ! WEST BOUND ! - ! acc region + ! acc kernels IF (GWEST) THEN - ! acc region + ! acc kernels ZQL0(IIB-1,IJS:IJN,:) = ZQL0(IIB,IJS:IJN,:) - ! acc end region + ! acc end kernels ENDIF ! ZQR0(IIB-1:IIE,IJS:IJN,:) = ZQL0(IIB:IIE+1,IJS:IJN,:) ! #ifdef TEMPO_JUAN -!$acc end region +!$acc end kernels CALL GET_HALO_D(ZQR0,HDIR="01_X") -!$acc region +!$acc kernels #endif ! ! EAST BOUND ! IF (GEAST) THEN - ! acc region + ! acc kernels ZQR0(IIE+1,IJS:IJN,:) = ZQR0(IIE,IJS:IJN,:) - ! acc end region + ! acc end kernels ENDIF - -DO K=1,IKU ; DO J = 1,IJU ; DO I=1,IIU +DO K=1,IKU + DO J = 1,IJU + !$acc loop vector(24) + DO I=1,IIU ! ! determine initial coefficients of the parabolae ! @@ -572,9 +582,9 @@ ENDDO ; ENDDO ; ENDDO * ZQ6(IIB-1:IIE,IJS:IJN,:)) ! #ifdef TEMPO_JUAN -!$acc end region +!$acc end kernels CALL GET_HALO_D(ZFPOS,HDIR="01_X") -!$acc region +!$acc kernels #endif ! ! @@ -583,10 +593,10 @@ CALL GET_HALO_D(ZFPOS,HDIR="01_X") ! advection flux at open boundary when u(IIB) > 0 ! IF (GWEST) THEN - ! acc region + ! acc kernels ZFPOS(IIB,IJS:IJN,:) = (PSRC(IIB-1,IJS:IJN,:) - ZQR(IIB-1,IJS:IJN,:))*PCR(IIB,IJS:IJN,:) + & ZQR(IIB-1,IJS:IJN,:) - ! acc end region + ! acc end kernels ! PPOSX(IIB-1,:,:) is not important for the calc of advection so ! we set it to 0 ENDIF @@ -595,24 +605,24 @@ CALL GET_HALO_D(ZFPOS,HDIR="01_X") ( ZDQ(:,IJS:IJN,:) + (1.0 + 2.0*PCR(:,IJS:IJN,:)/3.0) * ZQ6(:,IJS:IJN,:) ) ! #ifdef TEMPO_JUAN -!$acc end region +!$acc end kernels CALL GET_HALO_D(ZFNEG,HDIR="01_X") -!$acc region +!$acc kernels #endif ! ! EAST BOUND ! ! advection flux at open boundary when u(IIE+1) < 0 IF (GEAST) THEN - ! acc region + ! acc kernels ZFNEG(IIE+1,IJS:IJN,:) = (ZQR(IIE,IJS:IJN,:)-PSRC(IIE+1,IJS:IJN,:))*PCR(IIE+1,IJS:IJN,:) + & ZQR(IIE,IJS:IJN,:) - ! acc end region + ! acc end kernels ENDIF ! ! advect the actual field in X direction by U*dt ! - ! acc region + ! acc kernels mxm(ZQL,PRHO) ZQR = PCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) dxf(PR,ZQR) @@ -621,7 +631,7 @@ CALL GET_HALO_D(ZFNEG,HDIR="01_X") !!$ ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) #ifdef JUAN_ACC_01_X -!$acc end region +!$acc end kernels #endif CALL GET_HALO_D(PR,HDIR="01_X") @@ -820,7 +830,7 @@ ZQR0=PSRC ZQ60=PSRC ZFPOS=PSRC ZFNEG=PSRC -! acc end region +! acc end kernels ! !!$SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side !!$! @@ -929,9 +939,9 @@ ZFNEG=PSRC ! ! calculate dmq !! ZDMQ = DIF2Y(PSRC) - !#acc region + !#acc kernels dif2y(ZDMQ,PSRC) - !#acc end region + !#acc end kernels ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary @@ -940,30 +950,30 @@ ZFNEG=PSRC ! !!$ IF (LSOUTH_ll()) THEN IF (GSOUTH) THEN - !#acc region + !#acc kernels ZDMQ(IIW:IIA,IJB-1,:) = -ZDMQ(IIW:IIA,IJB,:) - !#acc end region + !#acc end kernels ENDIF ! ! NORTH BOUND ! IF (GNORTH) THEN - !#acc region + !#acc kernels ZDMQ(IIW:IIA,IJE+1,:) = -ZDMQ(IIW:IIA,IJE,:) - !#acc end region + !#acc end kernels ENDIF ! ! monotonize the difference followinq eq. 5 in Lin94 - !#acc region + !#acc kernels ZDMQ(IIW:IIA,IJB:IJE,:) = & SIGN( (MIN( ABS(ZDMQ(IIW:IIA,IJB:IJE,:)),2.0*(PSRC(IIW:IIA,IJB:IJE,:) - & MIN(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:))), & 2.0*(MAX(PSRC(IIW:IIA,IJB-1:IJE-1,:),PSRC(IIW:IIA,IJB:IJE,:),PSRC(IIW:IIA,IJB+1:IJE+1,:)) - & PSRC(IIW:IIA,IJB:IJE,:)) )), ZDMQ(IIW:IIA,IJB:IJE,:) ) - !#acc end region + !#acc end kernels -!!$ !#acc region +!!$ !#acc kernels !!$ DO K=1,IKU ; DO J=IJB,IJE !!$ !#acc do independent !!$ DO I=IIW,IIA ; ZDMQ(I,J,K) = SIGN( (MIN( ABS(ZDMQ(I,J,K)),2.0*(PSRC(I,J,K) - & @@ -971,7 +981,7 @@ ZFNEG=PSRC !!$ 2.0*(MAX(PSRC(I,J-1,K),PSRC(I,J,K),PSRC(I,J+1,K)) - & !!$ PSRC(I,J,K)) )), ZDMQ(I,J,K) ) !!$ ENDDO ; ENDDO ; ENDDO -!!$ !#acc end region +!!$ !#acc end kernels ! ! update ZDMQ HALO before next/further utilisation @@ -984,17 +994,17 @@ CALL GET_HALO_D(ZDMQ,HDIR="01_Y") ! ! calculate qL and qR with the modified dmq ! - !#acc region + !#acc kernels ZQL0(IIW:IIA,IJB:IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJB:IJE+1,:) + PSRC(IIW:IIA,IJB-1:IJE,:)) - & (ZDMQ(IIW:IIA,IJB:IJE+1,:) - ZDMQ(IIW:IIA,IJB-1:IJE,:))/6.0 - !#acc end region + !#acc end kernels -!!$ !#acc region +!!$ !#acc kernels !!$ DO K=1,IKU ; DO J=IJB,IJE+1 !!$ !#acc do independent !!$ DO I=IIW,IIA ; ZQL0(I,J,K) = 0.5*(PSRC(I,J,K) + PSRC(I,J-1,K)) - (ZDMQ(I,J,K) - ZDMQ(I,J-1,K))/6.0 !!$ ENDDO ; ENDDO ; ENDDO -!!$ !#acc end region +!!$ !#acc end kernels ! #ifdef TEMPO_JUAN !$acc end kernels @@ -1006,33 +1016,33 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ! !!$ IF (LSOUTH_ll()) THEN IF (GSOUTH) THEN - !#acc region + !#acc kernels ZQL0(IIW:IIA,IJB-1,:) = ZQL0(IIW:IIA,IJB,:) - !#acc end region + !#acc end kernels ENDIF ! - !#acc region + !#acc kernels ZQR0(IIW:IIA,IJB-1:IJE,:) = ZQL0(IIW:IIA,IJB:IJE+1,:) - !#acc end region + !#acc end kernels -!!$ !#acc region +!!$ !#acc kernels !!$ DO K=1,IKU ; DO J=IJB-1,IJE !!$ !#acc do independent !!$ DO I=IIW,IIA ; ZQR0(I,J,K) = ZQL0(I,J+1,K) !!$ ENDDO ; ENDDO ; ENDDO -!!$ !#acc end region +!!$ !#acc end kernels ! ! NORTH BOUND ! IF (GNORTH) THEN - !#acc region + !#acc kernels ZQR0(IIW:IIA,IJE+1,:) = ZQR0(IIW:IIA,IJE,:) - !#acc end region + !#acc end kernels ENDIF ! ! determine initial coefficients of the parabolae ! - !#acc region + !#acc kernels ZDQ = ZQR0 - ZQL0 ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0)) ! @@ -1041,11 +1051,11 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ZQL = ZQL0 ZQR = ZQR0 ZQ6 = ZQ60 - !#acc end region + !#acc end kernels ! ! eliminate over and undershoots and create qL and qR as in Lin96 ! - ! acc region + ! acc kernels WHERE ( ZDMQ == 0.0 ) ZQL = PSRC ZQR = PSRC @@ -1061,30 +1071,30 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ZQL = ZQR0 - ZQ6 ZQR = ZQR0 END WHERE - ! acc end region + ! acc end kernels ! ! recalculate coefficients of the parabolae ! - !#acc region + !#acc kernels ZDQ = ZQR - ZQL - !#acc end region + !#acc end kernels ! ! and finally calculate fluxes for the advection - !#acc region + !#acc kernels ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZQR(IIW:IIA,IJB-1:IJE,:) - 0.5*PCR(IIW:IIA,IJB:IJE+1,:) * & (ZDQ(IIW:IIA,IJB-1:IJE,:) - (1.0 - 2.0*PCR(IIW:IIA,IJB:IJE+1,:)/3.0) & * ZQ6(IIW:IIA,IJB-1:IJE,:)) - !#acc end region + !#acc end kernels -!!$ !#acc region +!!$ !#acc kernels !!$ DO K=1,IKU ; DO J=IJB,IJE+1 !!$ !#acc do independent !!$ DO I=IIW,IIA ; ZFPOS(I,J,K) = ZQR(I,J-1,K) - 0.5*PCR(I,J,K) * & !!$ (ZDQ(I,J-1,K) - (1.0 - 2.0*PCR(I,J,K)/3.0) & !!$ * ZQ6(I,J-1,K)) !!$ ENDDO ; ENDDO ; ENDDO -!!$ !#acc end region +!!$ !#acc end kernels ! #ifdef TEMPO_JUAN !$acc end kernels @@ -1099,26 +1109,26 @@ CALL GET_HALO_D(ZFPOS,HDIR="01_Y") ! !!$ IF (LSOUTH_ll()) THEN IF (GSOUTH) THEN - !#acc region + !#acc kernels ZFPOS(IIW:IIA,IJB,:) = (PSRC(IIW:IIA,IJB-1,:) - ZQR(IIW:IIA,IJB-1,:))*PCR(IIW:IIA,IJB,:) + & ZQR(IIW:IIA,IJB-1,:) - !#acc end region + !#acc end kernels ENDIF ! ! PPOSX(:,IJB-1,:) is not important for the calc of advection so ! we set it to 0 - !#acc region + !#acc kernels ZFNEG(IIW:IIA,:,:) = ZQL(IIW:IIA,:,:) - 0.5*PCR(IIW:IIA,:,:) * & ( ZDQ(IIW:IIA,:,:) + (1.0 + 2.0*PCR(IIW:IIA,:,:)/3.0) * ZQ6(IIW:IIA,:,:) ) - !#acc end region + !#acc end kernels -!!$ !#acc region +!!$ !#acc kernels !!$ DO K=1,IKU ; DO J=1,IJU !!$ !#acc do independent !!$ DO I=IIW,IIA ; ZFNEG(I,J,K) = ZQL(I,J,K) - 0.5*PCR(I,J,K) * & !!$ ( ZDQ(I,J,K) + (1.0 + 2.0*PCR(I,J,K)/3.0) * ZQ6(I,J,K) ) !!$ ENDDO ; ENDDO ; ENDDO -!!$ !#acc end region +!!$ !#acc end kernels ! #ifdef TEMPO_JUAN !$acc end kernels @@ -1131,19 +1141,19 @@ CALL GET_HALO_D(ZFPOS,HDIR="01_Y") ! NORTH BOUND ! IF (GNORTH) THEN - !#acc region + !#acc kernels ZFNEG(IIW:IIA,IJE+1,:) = (ZQR(IIW:IIA,IJE,:)-PSRC(IIW:IIA,IJE+1,:))*PCR(IIW:IIA,IJE+1,:) + & ZQR(IIW:IIA,IJE,:) - !#acc end region + !#acc end kernels ENDIF !!$! !!$! advect the actual field in X direction by U*dt !!$! - !#acc region + !#acc kernels mym(ZQL,PRHO) ZQR = PCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) dyf(PR,ZQR) - !#acc end region + !#acc end kernels !!$ PR = ZDMQ + ZQL0 + ZDQ + ZQ60 + ZQL + ZQR + ZQ6 + ZQR0 + ZFPOS + ZFNEG @@ -1940,7 +1950,7 @@ ZPHAT=PSRC ZFPOS=PSRC ZFNEG=PSRC PR=PSRC -! acc end region +! acc end kernels ! acc end data region ! !------------------------------------------------------------------------------- -- GitLab