Ignore:
Timestamp:
Apr 12, 2013 6:19:32 AM (11 years ago)
Author:
raasch
Message:

asynchronous transfer of ghost point data for acc-optimized version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/time_integration.f90

    r1116 r1128  
    2020! Current revisions:
    2121! ------------------
    22 !
     22! asynchronous transfer of ghost point data realized for acc-optimized version:
     23! prognostic_equations are first called two times for those points required for
     24! the left-right and north-south exchange, respectively, and then for the
     25! remaining points,
     26! those parts requiring global communication moved from prognostic_equations to
     27! here
    2328!
    2429! Former revisions:
     
    134139!------------------------------------------------------------------------------!
    135140
     141    USE advec_ws
    136142    USE arrays_3d
    137143    USE averaging
     144    USE buoyancy_mod
    138145    USE control_parameters
    139146    USE cpulog
     
    147154    USE particle_attributes
    148155    USE pegrid
     156    USE production_e_mod
    149157    USE prognostic_equations_mod
    150158    USE statistics
     
    212220!--       on the timestep scheme
    213221          CALL timestep_scheme_steering
     222
     223!
     224!--       Calculate those variables needed in the tendency terms which need
     225!--       global communication
     226          IF ( .NOT. neutral )  CALL calc_mean_profile( pt, 4 )
     227          IF ( ocean         )  CALL calc_mean_profile( rho, 64 )
     228          IF ( humidity      )  CALL calc_mean_profile( vpt, 44 )
     229          IF ( .NOT. constant_diffusion )  CALL production_e_init
     230          IF ( ( ws_scheme_mom .OR. ws_scheme_sca )  .AND.  &
     231               intermediate_timestep_count == 1 )  CALL ws_statistics
    214232
    215233!
     
    224242             CALL prognostic_equations_vector
    225243          ELSEIF ( loop_optimization == 'acc' )  THEN
     244!             i_left  = nxl;         i_right = nxr
     245!             j_south = nys;         j_north = nyn
     246!             CALL prognostic_equations_acc
     247
     248             i_left  = nxl;         i_right = nxl+nbgp-1
     249             j_south = nys;         j_north = nyn
    226250             CALL prognostic_equations_acc
     251             i_left  = nxr-nbgp+1;  i_right = nxr
     252             j_south = nys;         j_north = nyn
     253             CALL prognostic_equations_acc
     254
     255!
     256!--          Exchange of ghost points (lateral boundary conditions)
     257             IF ( background_communication )  THEN
     258
     259                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
     260               
     261                send_receive = 'lr'
     262                sendrecv_in_background = .TRUE.
     263                req          = 0
     264                req_count    = 0
     265
     266                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     267                   on_device = .TRUE.         ! to be removed after complete porting
     268                ELSE                          ! of ghost point exchange
     269                   !$acc update host( e_p, pt_p, u_p, v_p, w_p )
     270                ENDIF
     271
     272                CALL exchange_horiz( u_p, nbgp )
     273                CALL exchange_horiz( v_p, nbgp )
     274                CALL exchange_horiz( w_p, nbgp )
     275                CALL exchange_horiz( pt_p, nbgp )
     276                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
     277                IF ( ocean )  THEN
     278                   CALL exchange_horiz( sa_p, nbgp )
     279                   CALL exchange_horiz( rho, nbgp )
     280                  CALL exchange_horiz( prho, nbgp )
     281                ENDIF
     282                IF (humidity  .OR.  passive_scalar)  THEN
     283                   CALL exchange_horiz( q_p, nbgp )
     284                   IF ( cloud_physics .AND. icloud_scheme == 0 )  THEN
     285                      CALL exchange_horiz( qr_p, nbgp )
     286                      CALL exchange_horiz( nr_p, nbgp )
     287                   ENDIF
     288                ENDIF
     289                IF ( cloud_droplets )  THEN
     290                   CALL exchange_horiz( ql, nbgp )
     291                   CALL exchange_horiz( ql_c, nbgp )
     292                   CALL exchange_horiz( ql_v, nbgp )
     293                   CALL exchange_horiz( ql_vp, nbgp )
     294                ENDIF
     295                IF ( wang_kernel  .OR.  turbulence )  CALL exchange_horiz( diss, nbgp )
     296
     297                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     298                   on_device = .FALSE.        ! to be removed after complete porting
     299                ELSE                          ! of ghost point exchange
     300                   !$acc update device( e_p, pt_p, u_p, v_p, w_p )
     301                ENDIF
     302
     303                sendrecv_in_background = .FALSE.
     304
     305                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'pause' )
     306
     307             ENDIF
     308
     309             i_left  = nxl+nbgp;    i_right = nxr-nbgp
     310             j_south = nys;         j_north = nys+nbgp-1
     311             CALL prognostic_equations_acc
     312             i_left  = nxl+nbgp;    i_right = nxr-nbgp
     313             j_south = nyn-nbgp+1;  j_north = nyn
     314             CALL prognostic_equations_acc
     315
     316             IF ( background_communication )  THEN
     317                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'start' )
     318#if defined( __parallel )
     319                CALL MPI_WAITALL( req_count, req, wait_stat, ierr )
     320#endif
     321                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'pause' )
     322
     323                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'continue' )
     324
     325                send_receive = 'ns'
     326                sendrecv_in_background = .TRUE.
     327                req          = 0
     328                req_count    = 0
     329
     330                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     331                   on_device = .TRUE.         ! to be removed after complete porting
     332                ELSE                          ! of ghost point exchange
     333                   !$acc update host( e_p, pt_p, u_p, v_p, w_p )
     334                ENDIF
     335
     336                CALL exchange_horiz( u_p, nbgp )
     337                CALL exchange_horiz( v_p, nbgp )
     338                CALL exchange_horiz( w_p, nbgp )
     339                CALL exchange_horiz( pt_p, nbgp )
     340                IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
     341                IF ( ocean )  THEN
     342                   CALL exchange_horiz( sa_p, nbgp )
     343                   CALL exchange_horiz( rho, nbgp )
     344                  CALL exchange_horiz( prho, nbgp )
     345                ENDIF
     346                IF (humidity  .OR.  passive_scalar)  THEN
     347                   CALL exchange_horiz( q_p, nbgp )
     348                   IF ( cloud_physics .AND. icloud_scheme == 0 )  THEN
     349                      CALL exchange_horiz( qr_p, nbgp )
     350                      CALL exchange_horiz( nr_p, nbgp )
     351                   ENDIF
     352                ENDIF
     353                IF ( cloud_droplets )  THEN
     354                   CALL exchange_horiz( ql, nbgp )
     355                   CALL exchange_horiz( ql_c, nbgp )
     356                   CALL exchange_horiz( ql_v, nbgp )
     357                   CALL exchange_horiz( ql_vp, nbgp )
     358                ENDIF
     359                IF ( wang_kernel  .OR.  turbulence )  CALL exchange_horiz( diss, nbgp )
     360
     361                IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     362                   on_device = .FALSE.        ! to be removed after complete porting
     363                ELSE                          ! of ghost point exchange
     364                   !$acc update device( e_p, pt_p, u_p, v_p, w_p )
     365                ENDIF
     366
     367                sendrecv_in_background = .FALSE.
     368
     369                CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
     370
     371             ENDIF
     372
     373             i_left  = nxl+nbgp;    i_right = nxr-nbgp
     374             j_south = nys+nbgp;    j_north = nyn-nbgp
     375             CALL prognostic_equations_acc
     376
     377             IF ( background_communication )  THEN
     378                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'continue' )
     379#if defined( __parallel )
     380                CALL MPI_WAITALL( req_count, req, wait_stat, ierr )
     381#endif
     382                send_receive = 'al'
     383                CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'stop' )
     384             ENDIF
     385
    227386          ENDIF
    228387
     
    230389!--       Particle transport/physics with the Lagrangian particle model
    231390!--       (only once during intermediate steps, because it uses an Euler-step)
     391!--       ### particle model should be moved before prognostic_equations, in order
     392!--       to regard droplet interactions directly
    232393          IF ( particle_advection  .AND.                         &
    233394               simulated_time >= particle_advection_start  .AND. &
     
    249410!
    250411!--       Exchange of ghost points (lateral boundary conditions)
    251           CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
    252 
    253           IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
    254              on_device = .TRUE.         ! to be removed after complete porting
    255           ELSE                          ! of ghost point exchange
    256              !$acc update host( e_p, pt_p, u_p, v_p, w_p )
    257           ENDIF
    258 
    259           CALL exchange_horiz( u_p, nbgp )
    260           CALL exchange_horiz( v_p, nbgp )
    261           CALL exchange_horiz( w_p, nbgp )
    262           CALL exchange_horiz( pt_p, nbgp )
    263           IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
    264           IF ( ocean )  THEN
    265              CALL exchange_horiz( sa_p, nbgp )
    266              CALL exchange_horiz( rho, nbgp )
    267              CALL exchange_horiz( prho, nbgp )
    268           ENDIF
    269           IF (humidity  .OR.  passive_scalar)  THEN
    270              CALL exchange_horiz( q_p, nbgp )
    271              IF ( cloud_physics  .AND.  icloud_scheme == 0  .AND.              &
    272                   precipitation)  THEN
    273                 CALL exchange_horiz( qr_p, nbgp )
    274                 CALL exchange_horiz( nr_p, nbgp )
    275              ENDIF
    276           ENDIF
    277           IF ( cloud_droplets )  THEN
    278              CALL exchange_horiz( ql, nbgp )
    279              CALL exchange_horiz( ql_c, nbgp )
    280              CALL exchange_horiz( ql_v, nbgp )
    281              CALL exchange_horiz( ql_vp, nbgp )
    282           ENDIF
    283           IF ( wang_kernel  .OR.  turbulence )  CALL exchange_horiz( diss, nbgp )
    284 
    285           IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
    286              on_device = .FALSE.        ! to be removed after complete porting
    287           ELSE                          ! of ghost point exchange
    288              !$acc update device( e_p, pt_p, u_p, v_p, w_p )
    289           ENDIF
    290 
    291           CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
     412          IF ( .NOT. background_communication )  THEN
     413
     414             CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' )
     415
     416             IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     417                on_device = .TRUE.         ! to be removed after complete porting
     418             ELSE                          ! of ghost point exchange
     419                !$acc update host( e_p, pt_p, u_p, v_p, w_p )
     420             ENDIF
     421
     422             CALL exchange_horiz( u_p, nbgp )
     423             CALL exchange_horiz( v_p, nbgp )
     424             CALL exchange_horiz( w_p, nbgp )
     425             CALL exchange_horiz( pt_p, nbgp )
     426             IF ( .NOT. constant_diffusion )  CALL exchange_horiz( e_p, nbgp )
     427             IF ( ocean )  THEN
     428                CALL exchange_horiz( sa_p, nbgp )
     429                CALL exchange_horiz( rho, nbgp )
     430                CALL exchange_horiz( prho, nbgp )
     431             ENDIF
     432             IF (humidity  .OR.  passive_scalar)  THEN
     433                CALL exchange_horiz( q_p, nbgp )
     434                IF ( cloud_physics .AND. icloud_scheme == 0 )  THEN
     435                   CALL exchange_horiz( qr_p, nbgp )
     436                   CALL exchange_horiz( nr_p, nbgp )
     437                ENDIF
     438             ENDIF
     439             IF ( cloud_droplets )  THEN
     440                CALL exchange_horiz( ql, nbgp )
     441                CALL exchange_horiz( ql_c, nbgp )
     442                CALL exchange_horiz( ql_v, nbgp )
     443                CALL exchange_horiz( ql_vp, nbgp )
     444             ENDIF
     445             IF ( wang_kernel  .OR.  turbulence )  CALL exchange_horiz( diss, nbgp )
     446
     447             IF ( numprocs == 1 )  THEN    ! workaround for single-core GPU runs
     448                on_device = .FALSE.        ! to be removed after complete porting
     449             ELSE                          ! of ghost point exchange
     450                !$acc update device( e_p, pt_p, u_p, v_p, w_p )
     451             ENDIF
     452
     453             CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' )
     454
     455          ENDIF
    292456
    293457!
Note: See TracChangeset for help on using the changeset viewer.