Changeset 665 for codes/icosagcm


Ignore:
Timestamp:
01/20/18 18:46:10 (6 years ago)
Author:
dubos
Message:

devel/unstructured : OpenMP fixes

Location:
codes/icosagcm/devel/src/unstructured
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/unstructured/caldyn_unstructured.F90

    r658 r665  
    4646SUBROUTINE compute_NH_geopot(tau, m_ik, m_il, theta, W_il, Phi_il) 
    4747  FIELD_MASS   :: m_ik, theta   ! IN*2 
    48   FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il  ! IN,INOUT*2, LOCAL*5  
     48  FIELD_GEOPOT :: m_il, W_il, Phi_il, Phi_star_il  ! IN,INOUT*2, LOCAL 
    4949  DBL :: tau, gamma, tau2_g, tau2_g2, g2, gm2, vreff, Rd_preff 
    5050  INTEGER :: iter 
     
    8383END SUBROUTINE compute_NH_geopot 
    8484 
    85 SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, hflux,du,dPhi,dW) 
     85SUBROUTINE compute_caldyn_slow_NH(u,rhodz,Phi,W, w_il,berni,gradPhi2,DePhil,v_el,G_el,F_el, hflux,du,dPhi,dW) 
    8686  FIELD_U      :: u, hflux, du   ! IN, OUT, OUT 
    87   FIELD_MASS   :: rhodz, berni   ! IN, LOCAL 
    88   FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, LOCAL  
    89   FIELD_UL     :: DePhil, v_el, G_el, F_el ! LOCAL 
     87  FIELD_MASS   :: rhodz, berni   ! IN, BUF 
     88  FIELD_GEOPOT :: Phi,W,dPhi,dW, w_il, gradPhi2  ! IN,IN, OUT,OUT, BUF*2 
     89  FIELD_UL     :: DePhil, v_el, G_el, F_el ! BUF*4 
    9090  DECLARE_INDICES 
    9191  DECLARE_EDGES 
     
    9696END SUBROUTINE compute_caldyn_slow_NH 
    9797 
    98 SUBROUTINE compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi,dW,du) 
     98SUBROUTINE compute_caldyn_solver(tau,rhodz,theta, berni,pres,m_il, pk,geopot,W,dPhi,dW,du) 
    9999  DBL, INTENT(IN) :: tau 
    100   FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, LOCAL 
     100  FIELD_MASS   :: rhodz,pk,berni,pres    ! IN, OUT, BUF*2 
    101101  FIELD_THETA  :: theta                  ! IN 
    102   FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, LOCAL  
     102  FIELD_GEOPOT :: geopot,W,dPhi,dW, m_il ! INOUT,INOUT, OUT,OUT, BUF 
    103103  FIELD_U      :: du                     ! OUT 
    104104  DECLARE_INDICES 
     
    113113END SUBROUTINE compute_caldyn_solver 
    114114 
    115 SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, du,dPhi,dW) 
    116   FIELD_MASS   :: mass, eta_dot, wcov, W_etadot 
    117   FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW 
    118   FIELD_U      :: du 
     115SUBROUTINE compute_caldyn_vert_NH(mass,geopot,W,wflux, eta_dot,wcov,W_etadot, du,dPhi,dW) 
     116  FIELD_MASS   :: mass, eta_dot, wcov, W_etadot ! IN, BUF*3 
     117  FIELD_GEOPOT :: geopot,W,wflux,dPhi,dW ! IN*3, INOUT*2 
     118  FIELD_U      :: du ! INOUT 
    119119  DECLARE_INDICES 
    120120  DBL :: w_ij, wflux_ij 
  • codes/icosagcm/devel/src/unstructured/data_unstructured.F90

    r663 r665  
    5858  !----------------------------      PROFILING      -------------------------- 
    5959   
    60   SUBROUTINE init_trace() 
     60  SUBROUTINE init_trace() BINDC(init_trace) 
     61    !$OMP MASTER 
    6162    time_spent(:)=0. 
    6263    bytes(:)=0 
    6364    nb_calls(:)=0 
     65    !$OMP END MASTER 
    6466  END SUBROUTINE init_trace 
    6567 
     
    6769    INTEGER :: id 
    6870    DBL :: total_spent 
     71    !$OMP MASTER 
    6972    total_spent=SUM(time_spent) 
    70     PRINT *, '========================= Performance metrics =========================' 
    71     PRINT *, 'Total time spent in instrumented code (seconds) :', total_spent 
    72     PRINT *, 'Name, #calls, %time, microsec/call, MB/sec'     
    73     DO id=1,nb_routines 
    74        IF(nb_calls(id)>0) PRINT *, id_name(id), nb_calls(id), INT(100.*time_spent(id)/total_spent), & 
    75             INT(1e6*time_spent(id)/nb_calls(id)), INT(1e-6*bytes(id)/time_spent(id)) 
    76     END DO 
    77     CALL init_trace() 
     73    IF(total_spent>.01) THEN 
     74       PRINT *, '========================= Performance metrics =========================' 
     75       PRINT *, 'Total time spent in instrumented code (seconds) :', total_spent 
     76       PRINT *, 'Name, #calls, %time, microsec/call, MB/sec'     
     77       DO id=1,nb_routines 
     78          IF(nb_calls(id)>0) PRINT *, id_name(id), nb_calls(id), INT(100.*time_spent(id)/total_spent), & 
     79               INT(1e6*time_spent(id)/nb_calls(id)), INT(1e-6*bytes(id)/time_spent(id)) 
     80       END DO 
     81       CALL init_trace() 
     82    END IF 
     83    !$OMP END MASTER 
    7884  END SUBROUTINE print_trace 
    7985 
    8086  SUBROUTINE enter_trace(id, nbytes) 
    8187    INTEGER :: id, nbytes 
     88    !$OMP MASTER 
    8289    current_id = id 
    8390    bytes(id) = bytes(id) + nbytes 
    8491    nb_calls(id)=nb_calls(id)+1 
    8592    start_time = OMP_GET_WTIME() 
     93    !$OMP END MASTER 
    8694  END SUBROUTINE enter_trace 
    8795 
    8896  SUBROUTINE exit_trace() 
    8997    DBL :: elapsed 
     98    !$OMP MASTER 
    9099    elapsed = OMP_GET_WTIME()-start_time 
    91100    IF(elapsed<0.) elapsed=0. 
    92101    time_spent(current_id) = time_spent(current_id) + elapsed 
     102    !$OMP END MASTER 
    93103  END SUBROUTINE exit_trace 
    94104 
  • codes/icosagcm/devel/src/unstructured/timestep_unstructured.F90

    r658 r665  
    4545    FIELD_GEOPOT :: wflux, w, geopot, &               ! DIAG, INOUT 
    4646         dPhi_fast, dPhi_slow, dW_fast, dW_slow       ! OUT 
    47     FIELD_U      :: u,du_fast,du_slow,hflux,Ftheta,qu ! INOUT,OUT,OUT,DIAG 
     47    FIELD_U      :: u,du_fast,du_slow,hflux,qu        ! INOUT,OUT,OUT,DIAG 
    4848    FIELD_Z      :: qv                                ! DIAG 
    4949    FIELD_PS     :: ps,dmass_col,mass_col             ! OUT,OUT,IN (if eta_mass) or OUT,UNUSED,UNUSED (if eta_lag) 
    50     FIELD_UL     :: wwuu 
     50    ! buffers for fields that need to be shared among OpenMP threads 
     51    ! vertical size is allocated as llm+1 even if only llm is needed 
     52    FIELD_GEOPOT :: bufm1, bufm2, bufm3 
     53    FIELD_UL     :: bufu1, bufu2, bufu3,bufu4 
     54 
    5155    DBL          :: time1,time2 
    5256    INTEGER :: ij 
    5357     
    54     CALL init_trace() 
    5558    !  CALL CPU_TIME(time1) 
    5659    time1=OMP_GET_WTIME() 
     
    7275       CALL compute_pvort_only(rhodz,u,qv,qu) 
    7376       CALL compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du_slow) 
    74        CALL compute_coriolis(hflux,theta,qu,Ftheta, drhodz,dtheta_rhodz,du_slow) 
     77       CALL compute_coriolis(hflux,theta,qu, bufu1, drhodz,dtheta_rhodz,du_slow) 
    7578       IF(caldyn_eta == eta_mass) THEN 
    76           CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,wwuu) 
     79          CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,bufu1) 
    7780       END IF 
    7881       !$OMP END PARALLEL 
     
    8891       END DO 
    8992       CALL compute_theta(mass_col,rhodz,theta_rhodz, theta) 
    90        CALL compute_caldyn_solver(tau,rhodz,theta,pk,geopot,W,dPhi_fast,dW_fast,du_fast) 
     93       CALL compute_caldyn_solver(tau,rhodz,theta, bufm1,bufm2,bufm3, pk,geopot,W,dPhi_fast,dW_fast,du_fast) 
    9194       CALL compute_caldyn_fast(tau, pk,berni,theta,geopot, du_fast,u) 
    9295       CALL compute_pvort_only(rhodz,u,qv,qu) 
    93        CALL compute_caldyn_slow_NH(u,rhodz,geopot,W, hflux,du_slow,dPhi_slow,dW_slow)  
    94        CALL compute_coriolis(hflux,theta,qu,Ftheta, drhodz,dtheta_rhodz,du_slow) 
     96       CALL compute_caldyn_slow_NH(u,rhodz,geopot,W, bufm1,bufm2,bufm3,bufu1,bufu2,bufu3,bufu4, hflux,du_slow,dPhi_slow,dW_slow)  
     97       CALL compute_coriolis(hflux,theta,qu, bufu1, drhodz,dtheta_rhodz,du_slow) 
    9598       IF(caldyn_eta == eta_mass) THEN 
    96           CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,wwuu) 
    97           CALL compute_caldyn_vert_NH(rhodz,geopot,W,wflux, du_slow,dPhi_slow,dW_slow) 
     99          CALL caldyn_vert(drhodz,rhodz,theta,u, dmass_col,wflux,dtheta_rhodz,du_slow,bufu1) 
     100          CALL compute_caldyn_vert_NH(rhodz,geopot,W,wflux, bufm1,bufm2,bufm3, du_slow,dPhi_slow,dW_slow) 
    98101       END IF 
    99102    END IF 
     
    117120    FIELD_MASS   :: rhodz, pk, berni                 ! IN, DIAG 
    118121    FIELD_THETA  :: theta_rhodz, theta               ! IN, DIAG 
    119     FIELD_U      :: u,hflux,qu,Ftheta                ! INOUT,DIAG*3 
    120     FIELD_GEOPOT :: geopot, w, wflux, w_il           ! IN, INOUT, DIAG, DIAG 
     122    FIELD_U      :: u,hflux,qu                       ! INOUT,DIAG*2 
     123    FIELD_GEOPOT :: geopot, w, wflux                 ! IN, INOUT, DIAG 
    121124    FIELD_Z      :: qv                               ! DIAG 
    122125    DOUBLE2(       primal_num, max_nb_stage) :: dmass_col    ! OUT 
     
    126129    DOUBLE3(llm+1, primal_num, max_nb_stage) :: & 
    127130         dPhi_fast, dPhi_slow, dW_fast, dW_slow      ! OUT 
    128     FIELD_UL     :: DePhil, v_el, G_el, wwuu         ! DIAG*4 
     131    ! buffers for fields that need to be shared among OpenMP threads 
     132    ! vertical size is allocated as llm+1 even if only llm is needed 
     133    FIELD_GEOPOT :: bufm1, bufm2, bufm3 
     134    FIELD_UL     :: bufu1, bufu2, bufu3,bufu4 
    129135    DBL       :: time1,time2 
    130136    INTEGER :: step, stage, ij 
    131137     
    132     CALL init_trace() 
    133138    !CALL CPU_TIME(time1) 
    134139    time1=OMP_GET_WTIME() 
     
    154159             CALL compute_pvort_only(rhodz,u,qv,qu) 
    155160             CALL compute_caldyn_slow_hydro(rhodz,theta,u, berni,hflux,du_slow(:,:,stage)) 
    156              CALL compute_coriolis(hflux,theta,qu,Ftheta, drhodz(:,:,stage), dtheta_rhodz(:,:,:,stage),du_slow(:,:,stage)) 
     161             CALL compute_coriolis(hflux,theta,qu, bufu1, drhodz(:,:,stage), dtheta_rhodz(:,:,:,stage),du_slow(:,:,stage)) 
    157162             IF(caldyn_eta == eta_mass) THEN 
    158163                CALL caldyn_vert(drhodz(:,:,stage),rhodz,theta,u, & 
    159                      dmass_col(:,stage),wflux,dtheta_rhodz(:,:,:,stage),du_slow(:,:,stage),wwuu) 
     164                     dmass_col(:,stage),wflux,dtheta_rhodz(:,:,:,stage),du_slow(:,:,stage),bufu1) 
    160165             END IF 
    161166              
     
    168173             !$OMP END DO 
    169174             CALL compute_theta(mass_col,rhodz,theta_rhodz, theta) 
    170              CALL compute_caldyn_solver(tauj(stage),rhodz,theta,pk,geopot,W, & 
     175             CALL compute_caldyn_solver(tauj(stage),rhodz,theta, bufm1,bufm2,bufm3, pk,geopot,W, & 
    171176                  dPhi_fast(:,:,stage), dW_fast(:,:,stage), du_fast(:,:,stage)) 
    172177             CALL compute_caldyn_fast(tauj(stage), pk,berni,theta,geopot, du_fast(:,:,stage),u) 
    173178             CALL compute_pvort_only(rhodz,u,qv,qu) 
    174              CALL compute_caldyn_slow_NH(u,rhodz,geopot,W, hflux, du_slow(:,:,stage), dPhi_slow(:,:,stage), dW_slow(:,:,stage)) 
    175              CALL compute_coriolis(hflux,theta,qu,Ftheta, drhodz(:,:,stage),dtheta_rhodz(:,:,:,stage), du_slow(:,:,stage)) 
     179             CALL compute_caldyn_slow_NH(u,rhodz,geopot,W, bufm1,bufm2,bufm3,bufu1,bufu2,bufu3,bufu4, hflux, & 
     180                  du_slow(:,:,stage), dPhi_slow(:,:,stage), dW_slow(:,:,stage)) 
     181             CALL compute_coriolis(hflux,theta,qu, bufu1, drhodz(:,:,stage),dtheta_rhodz(:,:,:,stage), du_slow(:,:,stage)) 
    176182             IF(caldyn_eta == eta_mass) THEN 
    177183                CALL caldyn_vert(drhodz(:,:,stage),rhodz,theta,u, & 
    178                      dmass_col(:,stage),wflux,dtheta_rhodz(:,:,:,stage), du_slow(:,:,stage), wwuu) 
    179                 CALL compute_caldyn_vert_NH(rhodz,geopot,W,wflux, du_slow(:,:,stage), dPhi_slow(:,:,stage), dW_slow(:,:,stage) ) 
     184                     dmass_col(:,stage),wflux,dtheta_rhodz(:,:,:,stage), du_slow(:,:,stage), bufu1) 
     185                CALL compute_caldyn_vert_NH(rhodz,geopot,W,wflux, bufm1,bufm2,bufm3, & 
     186                     du_slow(:,:,stage), dPhi_slow(:,:,stage), dW_slow(:,:,stage) ) 
    180187             END IF 
    181188          END IF ! NH 
Note: See TracChangeset for help on using the changeset viewer.