Skip to content

Commit 7db74f8

Browse files
committed
Initial OpenACC port of atm_divergence_damping_3d subroutine
This commit enables the GPU execution of the atm_divergence_damping_3d subroutine using OpenACC directives for the data movements and loops. A new timer, 'atm_divergence_damping_3d [ACC_data_xfer]', has been added for host- GPU data transfers in this subroutine. This port follows these considerations: - The data transfers for the invariant fields have been moved to mpas_atm_dynamics_init and finalize. - Explicitly adding gang, worker and vector level parallelism to parallel constructs in atm_compute_vert_imp_coefs_work. - The parallel constructs use default(present) clauses to avoid implicit data movements by the compiler. This change also requires dereferencing the pointers to nCellsSolve and nVertLevels, in order to avoid runtime error messages such as the following: FATAL ERROR: data in PRESENT clause was not found on device 1:name=ncellssolve
1 parent 589bbe6 commit 7db74f8

File tree

1 file changed

+31
-4
lines changed

1 file changed

+31
-4
lines changed

src/core_atmosphere/dynamics/mpas_atm_time_integration.F

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ subroutine mpas_atm_dynamics_init(domain)
212212
real (kind=RKIND), dimension(:), pointer :: invAreaCell
213213
integer, dimension(:), pointer :: bdyMaskCell
214214
integer, dimension(:), pointer :: bdyMaskEdge
215+
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
215216
real (kind=RKIND), dimension(:), pointer :: invDvEdge
216217
real (kind=RKIND), dimension(:), pointer :: dcEdge
217218
real (kind=RKIND), dimension(:), pointer :: invDcEdge
@@ -295,6 +296,9 @@ subroutine mpas_atm_dynamics_init(domain)
295296
call mpas_pool_get_array(mesh, 'bdyMaskEdge', bdyMaskEdge)
296297
!$acc enter data copyin(bdyMaskEdge)
297298

299+
call mpas_pool_get_array(mesh, 'specZoneMaskEdge', specZoneMaskEdge)
300+
!$acc enter data copyin(specZoneMaskEdge)
301+
298302
call mpas_pool_get_array(mesh, 'invDvEdge', invDvEdge)
299303
!$acc enter data copyin(invDvEdge)
300304

@@ -412,6 +416,7 @@ subroutine mpas_atm_dynamics_finalize(domain)
412416
real (kind=RKIND), dimension(:), pointer :: invAreaCell
413417
integer, dimension(:), pointer :: bdyMaskCell
414418
integer, dimension(:), pointer :: bdyMaskEdge
419+
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
415420
real (kind=RKIND), dimension(:), pointer :: invDvEdge
416421
real (kind=RKIND), dimension(:), pointer :: dcEdge
417422
real (kind=RKIND), dimension(:), pointer :: invDcEdge
@@ -495,6 +500,9 @@ subroutine mpas_atm_dynamics_finalize(domain)
495500
call mpas_pool_get_array(mesh, 'bdyMaskEdge', bdyMaskEdge)
496501
!$acc exit data delete(bdyMaskEdge)
497502

503+
call mpas_pool_get_array(mesh, 'specZoneMaskEdge', specZoneMaskEdge)
504+
!$acc exit data delete(specZoneMaskEdge)
505+
498506
call mpas_pool_get_array(mesh, 'invDvEdge', invDvEdge)
499507
!$acc exit data delete(invDvEdge)
500508

@@ -2696,8 +2704,10 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
26962704
real (kind=RKIND), dimension(:), pointer :: specZoneMaskEdge
26972705
26982706
integer, dimension(:,:), pointer :: cellsOnEdge
2699-
integer, pointer :: nCellsSolve
2700-
integer, pointer :: nVertLevels
2707+
integer, pointer :: nCellsSolve_ptr
2708+
integer, pointer :: nVertLevels_ptr
2709+
integer :: nCellsSolve
2710+
integer :: nVertLevels
27012711
27022712
real (kind=RKIND) :: divCell1, divCell2, rdts, coef_divdamp
27032713
integer :: cell1, cell2, iEdge, k
@@ -2710,15 +2720,24 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27102720
call mpas_pool_get_array(diag, 'rtheta_pp_old', rtheta_pp_old)
27112721
call mpas_pool_get_array(diag, 'ru_p', ru_p)
27122722
2713-
call mpas_pool_get_dimension(mesh, 'nCellsSolve', nCellsSolve)
2714-
call mpas_pool_get_dimension(mesh, 'nVertLevels', nVertLevels)
2723+
call mpas_pool_get_dimension(mesh, 'nCellsSolve', nCellsSolve_ptr)
2724+
call mpas_pool_get_dimension(mesh, 'nVertLevels', nVertLevels_ptr)
27152725
27162726
call mpas_pool_get_config(configs, 'config_smdiv', smdiv)
27172727
call mpas_pool_get_config(configs, 'config_len_disp', config_len_disp)
27182728
27192729
rdts = 1.0_RKIND / dts
27202730
coef_divdamp = 2.0_RKIND * smdiv * config_len_disp * rdts
27212731
2732+
nCellsSolve = nCellsSolve_ptr
2733+
nVertLevels = nVertLevels_ptr
2734+
2735+
MPAS_ACC_TIMER_START('atm_divergence_damping_3d [ACC_data_xfer]')
2736+
!$acc enter data copyin(ru_p, rtheta_pp, rtheta_pp_old, theta_m)
2737+
MPAS_ACC_TIMER_STOP('atm_divergence_damping_3d [ACC_data_xfer]')
2738+
2739+
!$acc parallel default(present)
2740+
!$acc loop gang worker
27222741
do iEdge=edgeStart,edgeEnd ! MGD do we really just need edges touching owned cells?
27232742
27242743
cell1 = cellsOnEdge(1,iEdge)
@@ -2728,6 +2747,7 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27282747
if (cell1 <= nCellsSolve .or. cell2 <= nCellsSolve ) then
27292748
27302749
!DIR$ IVDEP
2750+
!$acc loop vector
27312751
do k=1,nVertLevels
27322752
27332753
!! unscaled 3d divergence damping
@@ -2745,6 +2765,13 @@ subroutine atm_divergence_damping_3d( state, diag, mesh, configs, dts, edgeStart
27452765
end do
27462766
end if ! edges for block-owned cells
27472767
end do ! end loop over edges
2768+
!$acc end parallel
2769+
2770+
MPAS_ACC_TIMER_START('atm_divergence_damping_3d [ACC_data_xfer]')
2771+
!$acc exit data copyout(ru_p) &
2772+
!$acc delete(rtheta_pp, rtheta_pp_old, theta_m)
2773+
MPAS_ACC_TIMER_STOP('atm_divergence_damping_3d [ACC_data_xfer]')
2774+
27482775
27492776
end subroutine atm_divergence_damping_3d
27502777

0 commit comments

Comments
 (0)