Skip to content

Commit 589bbe6

Browse files
committed
Merge branch 'atmosphere/port_atm_compute_vert_imp_coefs' into develop (PR #1241)
This merge enables GPU execution of the atm_compute_vert_imp_coefs_work subroutine using OpenACC directives for the data movement and loops. A new timer, 'atm_compute_vert_imp_coefs_work [ACC_data_xfer]', has been added for data transfers in the atm_compute_vert_imp_coefs_work subroutine. Results from a regional simulation are bit-wise identical pre- and post-merge. * atmosphere/port_atm_compute_vert_imp_coefs: Initial OpenACC port of atm_compute_vert_imp_coefs subroutine
2 parents 5ddeda6 + ba661fc commit 589bbe6

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/core_atmosphere/dynamics/mpas_atm_time_integration.F

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ subroutine mpas_atm_dynamics_init(domain)
229229
real (kind=RKIND), dimension(:), pointer :: fEdge
230230
real (kind=RKIND), dimension(:), pointer :: fVertex
231231
real (kind=RKIND), dimension(:,:), pointer :: zz
232+
real (kind=RKIND), dimension(:), pointer :: rdzw
233+
real (kind=RKIND), dimension(:), pointer :: rdzu
232234
real (kind=RKIND), dimension(:,:,:), pointer :: zb_cell
233235
real (kind=RKIND), dimension(:,:,:), pointer :: zb3_cell
234236
real (kind=RKIND), dimension(:), pointer :: fzm
@@ -344,6 +346,12 @@ subroutine mpas_atm_dynamics_init(domain)
344346
call mpas_pool_get_array(mesh, 'zz', zz)
345347
!$acc enter data copyin(zz)
346348

349+
call mpas_pool_get_array(mesh, 'rdzw', rdzw)
350+
!$acc enter data copyin(rdzw)
351+
352+
call mpas_pool_get_array(mesh, 'rdzu', rdzu)
353+
!$acc enter data copyin(rdzu)
354+
347355
call mpas_pool_get_array(mesh, 'zb_cell', zb_cell)
348356
!$acc enter data copyin(zb_cell)
349357

@@ -421,6 +429,8 @@ subroutine mpas_atm_dynamics_finalize(domain)
421429
real (kind=RKIND), dimension(:), pointer :: fEdge
422430
real (kind=RKIND), dimension(:), pointer :: fVertex
423431
real (kind=RKIND), dimension(:,:), pointer :: zz
432+
real (kind=RKIND), dimension(:), pointer :: rdzw
433+
real (kind=RKIND), dimension(:), pointer :: rdzu
424434
real (kind=RKIND), dimension(:,:,:), pointer :: zb_cell
425435
real (kind=RKIND), dimension(:,:,:), pointer :: zb3_cell
426436
real (kind=RKIND), dimension(:), pointer :: fzm
@@ -536,6 +546,12 @@ subroutine mpas_atm_dynamics_finalize(domain)
536546
call mpas_pool_get_array(mesh, 'zz', zz)
537547
!$acc exit data delete(zz)
538548

549+
call mpas_pool_get_array(mesh, 'rdzw', rdzw)
550+
!$acc exit data delete(rdzw)
551+
552+
call mpas_pool_get_array(mesh, 'rdzu', rdzu)
553+
!$acc exit data delete(rdzu)
554+
539555
call mpas_pool_get_array(mesh, 'zb_cell', zb_cell)
540556
!$acc exit data delete(zb_cell)
541557

@@ -2012,32 +2028,45 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
20122028
real (kind=RKIND) :: dtseps, c2, qtotal, rcv
20132029
real (kind=RKIND), dimension( nVertLevels ) :: b_tri, c_tri
20142030

2031+
MPAS_ACC_TIMER_START('atm_compute_vert_imp_coefs_work [ACC_data_xfer]')
2032+
!$acc enter data copyin(cqw, p, t, qtot, rb, rtb, rt, pb)
2033+
!$acc enter data create(cofrz, cofwr, cofwz, coftz, cofwt, a_tri, b_tri, &
2034+
!$acc c_tri, alpha_tri, gamma_tri)
2035+
MPAS_ACC_TIMER_STOP('atm_compute_vert_imp_coefs_work [ACC_data_xfer]')
20152036

20162037
! set coefficients
20172038
dtseps = .5*dts*(1.+epssm)
20182039
rcv = rgas/(cp-rgas)
20192040
c2 = cp*rcv
20202041

2042+
!$acc parallel default(present)
2043+
!$acc loop gang worker
20212044
! MGD bad to have all threads setting this variable?
20222045
do k=1,nVertLevels
20232046
cofrz(k) = dtseps*rdzw(k)
20242047
end do
2048+
!$acc end parallel
20252049

2050+
!$acc parallel default(present)
2051+
!$acc loop gang worker private(b_tri,c_tri)
20262052
do iCell = cellSolveStart,cellSolveEnd ! we only need to do cells we are solving for, not halo cells
20272053

20282054
!DIR$ IVDEP
2055+
!$acc loop vector
20292056
do k=2,nVertLevels
20302057
cofwr(k,iCell) =.5*dtseps*gravity*(fzm(k)*zz(k,iCell)+fzp(k)*zz(k-1,iCell))
20312058
end do
20322059
coftz(1,iCell) = 0.0
20332060
!DIR$ IVDEP
2061+
!$acc loop vector
20342062
do k=2,nVertLevels
20352063
cofwz(k,iCell) = dtseps*c2*(fzm(k)*zz(k,iCell)+fzp(k)*zz(k-1,iCell)) &
20362064
*rdzu(k)*cqw(k,iCell)*(fzm(k)*p (k,iCell)+fzp(k)*p (k-1,iCell))
20372065
coftz(k,iCell) = dtseps* (fzm(k)*t (k,iCell)+fzp(k)*t (k-1,iCell))
20382066
end do
20392067
coftz(nVertLevels+1,iCell) = 0.0
20402068
!DIR$ IVDEP
2069+
!$acc loop vector
20412070
do k=1,nVertLevels
20422071

20432072
! qtotal = 0.
@@ -2058,6 +2087,7 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
20582087
alpha_tri(1,iCell) = 0. ! note, this value is never used
20592088

20602089
!DIR$ IVDEP
2090+
!$acc loop vector
20612091
do k=2,nVertLevels
20622092
a_tri(k,iCell) = -cofwz(k ,iCell)* coftz(k-1,iCell)*rdzw(k-1)*zz(k-1,iCell) &
20632093
+cofwr(k ,iCell)* cofrz(k-1 ) &
@@ -2073,12 +2103,20 @@ subroutine atm_compute_vert_imp_coefs_work(nCells, moist_start, moist_end, dts,
20732103
+cofwt(k ,iCell)* coftz(k+1,iCell)*rdzw(k )
20742104
end do
20752105
!MGD VECTOR DEPENDENCE
2106+
!$acc loop seq
20762107
do k=2,nVertLevels
20772108
alpha_tri(k,iCell) = 1./(b_tri(k)-a_tri(k,iCell)*gamma_tri(k-1,iCell))
20782109
gamma_tri(k,iCell) = c_tri(k)*alpha_tri(k,iCell)
20792110
end do
20802111

20812112
end do ! loop over cells
2113+
!$acc end parallel
2114+
2115+
MPAS_ACC_TIMER_START('atm_compute_vert_imp_coefs_work [ACC_data_xfer]')
2116+
!$acc exit data copyout(cofrz, cofwr, cofwz, coftz, cofwt, a_tri, b_tri, &
2117+
!$acc c_tri, alpha_tri, gamma_tri)
2118+
!$acc exit data delete(cqw, p, t, qtot, rb, rtb, rt, pb)
2119+
MPAS_ACC_TIMER_STOP('atm_compute_vert_imp_coefs_work [ACC_data_xfer]')
20822120

20832121
end subroutine atm_compute_vert_imp_coefs_work
20842122

0 commit comments

Comments
 (0)