Ignore:
Timestamp:
07/15/19 12:29:31 (5 years ago)
Author:
adurocher
Message:

trunk : Added metric terms to kernels parameters to avoid Host/GPU transferts

Metric terms are now subroutine parameters instead of module variables in kernel subroutines. Dummy arguments for metric terms are now defined as fixed-size arrays, and arrays dimensions are well known when entering an 'acc data' region. Array descriptors are no longer transferred form host to device each time the data region is executed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/dissip/dissip_gcm.F90

    r953 r954  
    207207          u=f_u(ind) 
    208208          du=f_du(ind) 
    209           CALL compute_gradiv_inplace(u,1,1) 
     209          CALL compute_gradiv_inplace(u,Ai,ne,le,de,1,1) 
    210210          ! This should be ported on GPU but we are running into compiler issues... 
    211211          !$acc update host(u(:)) wait 
     
    306306          u=f_u(ind) 
    307307          du=f_du(ind) 
    308           CALL compute_gradrot_inplace(u,1,1) 
     308          CALL compute_gradrot_inplace(u,Av,ne,le,de,1,1) 
    309309          ! This should be ported on GPU but we are running into compiler issues... 
    310310          !$acc update host(u(:)) wait 
     
    401401          theta=f_theta(ind) 
    402402          dtheta=f_dtheta(ind) 
    403           CALL compute_divgrad_inplace(theta,1,1) 
     403          CALL compute_divgrad_inplace(theta,Ai,ne,le,de,1,1) 
    404404          ! This should be ported on GPU but we are running into compiler issues... 
    405405          !$acc update host(theta(:)) wait 
     
    707707        CALL swap_geometry(ind) 
    708708        due=f_due(ind) 
    709         CALL compute_gradiv_inplace(due,ll_begin,ll_end) 
     709        CALL compute_gradiv_inplace(due,Ai,ne,le,de,ll_begin,ll_end) 
    710710      ENDDO 
    711711    ENDDO 
     
    757757        CALL swap_geometry(ind) 
    758758        due=f_due(ind)  
    759         CALL compute_gradrot_inplace(due,ll_begin,ll_end) 
     759        CALL compute_gradrot_inplace(due,Av,ne,le,de,ll_begin,ll_end) 
    760760      ENDDO 
    761761 
     
    805805        CALL swap_geometry(ind) 
    806806        dtheta=f_dtheta(ind)  
    807         CALL compute_divgrad_inplace(dtheta,ll_begin,ll_end) 
     807        CALL compute_divgrad_inplace(dtheta,Ai,ne,le,de,ll_begin,ll_end) 
    808808      ENDDO 
    809809 
     
    857857        CALL swap_geometry(ind) 
    858858        dtheta_rhodz=f_dtheta_rhodz(ind)  
    859         CALL compute_divgrad_inplace(dtheta_rhodz,ll_begin,ll_end) 
     859        CALL compute_divgrad_inplace(dtheta_rhodz,Ai,ne,le,de,ll_begin,ll_end) 
    860860      ENDDO 
    861861 
     
    884884  END SUBROUTINE divgrad_theta_rhodz 
    885885 
    886   SUBROUTINE compute_gradiv(ue,gradivu_e,llb,lle) 
     886  SUBROUTINE compute_gradiv(ue,gradivu_e,Ai,ne,le,de,llb,lle) 
    887887    INTEGER,INTENT(IN)     :: llb 
    888888    INTEGER,INTENT(IN)     :: lle 
    889889    REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,llm) 
    890890    REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,llm) 
     891    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     892    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     893    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     894    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    891895 
    892896    gradivu_e = ue 
    893     CALL compute_gradiv_inplace(gradivu_e,llb,lle) 
     897    CALL compute_gradiv_inplace(gradivu_e,Ai,ne,le,de,llb,lle) 
    894898 
    895899  END SUBROUTINE compute_gradiv 
    896900   
    897   SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,llb,lle) 
    898     USE geometry, ONLY : Ai, ne, le, de 
     901  SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,Ai,ne,le,de,llb,lle) 
    899902    INTEGER,INTENT(IN)     :: llb 
    900903    INTEGER,INTENT(IN)     :: lle 
    901904    REAL(rstd),INTENT(INOUT) :: ue_gradivu_e(iim*3*jjm,llm) 
     905    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     906    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     907    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     908    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    902909    REAL(rstd) :: divu_i(iim*jjm,llb:lle) 
    903910     
     
    945952  END SUBROUTINE compute_gradiv_inplace 
    946953 
    947   SUBROUTINE compute_divgrad(theta,divgrad_i,llb,lle) 
     954  SUBROUTINE compute_divgrad(theta,divgrad_i,Ai,ne,le,de,llb,lle) 
    948955    INTEGER,INTENT(IN)     :: llb 
    949956    INTEGER,INTENT(IN)     :: lle 
    950957    REAL(rstd),INTENT(IN) :: theta(iim*jjm,1:lle) 
    951958    REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,1:lle) 
     959    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     960    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     961    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     962    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    952963 
    953964    divgrad_i = theta 
    954     CALL compute_divgrad_inplace(divgrad_i,llb,lle) 
     965    CALL compute_divgrad_inplace(divgrad_i,Ai,ne,le,de,llb,lle) 
    955966  END SUBROUTINE compute_divgrad 
    956967   
    957   SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,llb,lle) 
    958     USE geometry, ONLY : Ai, ne, le, de 
     968  SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,Ai,ne,le,de,llb,lle) 
    959969    INTEGER,INTENT(IN)     :: llb 
    960970    INTEGER,INTENT(IN)     :: lle 
    961971    REAL(rstd),INTENT(INOUT) :: theta_divgrad_i(iim*jjm,1:lle) 
     972    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     973    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     974    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     975    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    962976    REAL(rstd)  :: grad_e(3*iim*jjm,llb:lle) 
    963977 
     
    10031017  END SUBROUTINE compute_divgrad_inplace 
    10041018 
    1005   SUBROUTINE compute_gradrot(ue,gradrot_e,llb,lle) 
     1019  SUBROUTINE compute_gradrot(ue,gradrot_e,Av,ne,le,de,llb,lle) 
    10061020    INTEGER,INTENT(IN)     :: llb 
    10071021    INTEGER,INTENT(IN)     :: lle 
    10081022    REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,lle) 
    10091023    REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,lle) 
     1024    REAL(rstd),INTENT(IN)  :: Av(2*iim*jjm) 
     1025    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     1026    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     1027    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    10101028 
    10111029    gradrot_e = ue 
    1012     CALL compute_gradrot_inplace(gradrot_e,llb,lle) 
     1030    CALL compute_gradrot_inplace(gradrot_e,Av,ne,le,de,llb,lle) 
    10131031  END SUBROUTINE compute_gradrot 
    10141032 
    1015   SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,llb,lle) 
    1016     USE geometry, ONLY : Av, ne, le, de 
     1033  SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,Av,ne,le,de,llb,lle) 
    10171034    INTEGER,INTENT(IN)     :: llb 
    10181035    INTEGER,INTENT(IN)     :: lle 
    10191036    REAL(rstd),INTENT(INOUT) :: ue_gradrot_e(iim*3*jjm,lle) 
     1037    REAL(rstd),INTENT(IN)  :: Av(2*iim*jjm) 
     1038    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     1039    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     1040    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    10201041    REAL(rstd) :: rot_v(2*iim*jjm,llb:lle) 
    10211042 
Note: See TracChangeset for help on using the changeset viewer.