Skip to content

Commit f5eea61

Browse files
committed
fix(amr): IGR sigma swap/restore kernels hoist bounds to scalars - the kernels referenced sw_idwbuff (and amr_isect_lo/start_idx) directly in loop bounds and bodies; those are host-only module state, so OpenACC's present lookup failed fatally (data in PRESENT clause not found: sw_idwbuff) on BOTH Cray-acc (Frontier) and nvfortran-acc (Phoenix) while OpenMP's implicit map(to) tolerated it - exactly why only acc lanes crashed on the IGR AMR goldens. Root-caused with NV_ACC_NOTIFY on a V100 (fault after the s_amr_copy_fine_fields launch, present-table dump names sw_idwbuff). Scalar hoisting is the established kernel idiom everywhere else in the file. CPU pair bit-identical
1 parent 5d9c459 commit f5eea61

1 file changed

Lines changed: 36 additions & 17 deletions

File tree

src/simulation/m_amr.fpp

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,28 +1344,44 @@ contains
13441344
impure subroutine s_amr_igr_swap_sigma()
13451345

13461346
integer :: j, k, l, ci, cj, ck
1347-
1347+
integer :: cb1, ce1, cb2, ce2, cb3, ce3, fb1, fe1, fb2, fe2, fb3, fe3
1348+
integer :: lo1, lo2, lo3, ox, oy, oz
1349+
1350+
! bounds/offsets hoisted to scalars: sw_idwbuff (and friends) are host-only module
1351+
! state - referencing them inside the kernels makes OpenACC's present lookup fail
1352+
! (OpenMP's implicit map(to) tolerates it, which is why only acc lanes crashed)
1353+
1354+
cb1 = sw_idwbuff(1)%beg; ce1 = sw_idwbuff(1)%end
1355+
cb2 = sw_idwbuff(2)%beg; ce2 = sw_idwbuff(2)%end
1356+
cb3 = sw_idwbuff(3)%beg; ce3 = sw_idwbuff(3)%end
1357+
fb1 = idwbuff(1)%beg; fe1 = idwbuff(1)%end
1358+
fb2 = idwbuff(2)%beg; fe2 = idwbuff(2)%end
1359+
fb3 = idwbuff(3)%beg; fe3 = idwbuff(3)%end
1360+
lo1 = amr_isect_lo(1); lo2 = amr_isect_lo(2); lo3 = amr_isect_lo(3)
1361+
ox = start_idx(1); oy = 0; oz = 0
1362+
if (n_glb > 0) oy = start_idx(2)
1363+
if (p_glb > 0) oz = start_idx(3)
13481364
$:GPU_PARALLEL_LOOP(collapse=3, private='[j, k, l]')
1349-
do l = sw_idwbuff(3)%beg, sw_idwbuff(3)%end
1350-
do k = sw_idwbuff(2)%beg, sw_idwbuff(2)%end
1351-
do j = sw_idwbuff(1)%beg, sw_idwbuff(1)%end
1365+
do l = cb3, ce3
1366+
do k = cb2, ce2
1367+
do j = cb1, ce1
13521368
sw_jac(j, k, l) = jac(j, k, l)
13531369
sw_jac_old(j, k, l) = jac_old(j, k, l)
13541370
end do
13551371
end do
13561372
end do
13571373
$:END_GPU_PARALLEL_LOOP()
13581374
$:GPU_PARALLEL_LOOP(collapse=3, private='[j, k, l, ci, cj, ck]')
1359-
do l = idwbuff(3)%beg, idwbuff(3)%end
1360-
do k = idwbuff(2)%beg, idwbuff(2)%end
1361-
do j = idwbuff(1)%beg, idwbuff(1)%end
1362-
ci = amr_isect_lo(1) + floor(real(j, wp)/2._wp) - start_idx(1)
1375+
do l = fb3, fe3
1376+
do k = fb2, fe2
1377+
do j = fb1, fe1
1378+
ci = lo1 + floor(real(j, wp)/2._wp) - ox
13631379
cj = 0; ck = 0
1364-
if (n_glb > 0) cj = amr_isect_lo(2) + floor(real(k, wp)/2._wp) - start_idx(2)
1365-
if (p_glb > 0) ck = amr_isect_lo(3) + floor(real(l, wp)/2._wp) - start_idx(3)
1366-
ci = min(max(ci, sw_idwbuff(1)%beg), sw_idwbuff(1)%end)
1367-
cj = min(max(cj, sw_idwbuff(2)%beg), sw_idwbuff(2)%end)
1368-
ck = min(max(ck, sw_idwbuff(3)%beg), sw_idwbuff(3)%end)
1380+
if (n_glb > 0) cj = lo2 + floor(real(k, wp)/2._wp) - oy
1381+
if (p_glb > 0) ck = lo3 + floor(real(l, wp)/2._wp) - oz
1382+
ci = min(max(ci, cb1), ce1)
1383+
cj = min(max(cj, cb2), ce2)
1384+
ck = min(max(ck, cb3), ce3)
13691385
jac(j, k, l) = sw_jac(ci, cj, ck)
13701386
jac_old(j, k, l) = sw_jac(ci, cj, ck)
13711387
end do
@@ -1378,12 +1394,15 @@ contains
13781394
!> Restore the coarse jac/jac_old saved by s_amr_igr_swap_sigma (bounds already restored).
13791395
impure subroutine s_amr_igr_restore_sigma()
13801396

1381-
integer :: j, k, l
1397+
integer :: j, k, l, b1, e1, b2, e2, b3, e3
13821398

1399+
b1 = idwbuff(1)%beg; e1 = idwbuff(1)%end
1400+
b2 = idwbuff(2)%beg; e2 = idwbuff(2)%end
1401+
b3 = idwbuff(3)%beg; e3 = idwbuff(3)%end
13831402
$:GPU_PARALLEL_LOOP(collapse=3, private='[j, k, l]')
1384-
do l = idwbuff(3)%beg, idwbuff(3)%end
1385-
do k = idwbuff(2)%beg, idwbuff(2)%end
1386-
do j = idwbuff(1)%beg, idwbuff(1)%end
1403+
do l = b3, e3
1404+
do k = b2, e2
1405+
do j = b1, e1
13871406
jac(j, k, l) = sw_jac(j, k, l)
13881407
jac_old(j, k, l) = sw_jac_old(j, k, l)
13891408
end do

0 commit comments

Comments
 (0)