Skip to content

Commit

Permalink
Port WriteEBSurface by copying EB information to pinned tmps before w…
Browse files Browse the repository at this point in the history
…riting. (#3793)


---------

Co-authored-by: Weiqun Zhang <[email protected]>
  • Loading branch information
atmyers and WeiqunZhang authored Mar 8, 2024
1 parent 5961a48 commit ba95d4c
Showing 1 changed file with 61 additions and 11 deletions.
72 changes: 61 additions & 11 deletions Src/EB/AMReX_WriteEBSurface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,62 @@ void WriteEBSurface (const BoxArray & ba, const DistributionMapping & dmap, cons

const auto & sfab = static_cast<EBFArrayBox const &>(mf_ba[mfi]);
const auto & my_flag = sfab.getEBCellFlagFab();
const auto * my_flag_ptr = &my_flag;

const Box & bx = mfi.validbox();

if (my_flag.getType(bx) == FabType::covered ||
my_flag.getType(bx) == FabType::regular) { continue; }

std::array<const MultiCutFab *, AMREX_SPACEDIM> areafrac;
const MultiCutFab * bndrycent;

areafrac = ebf->getAreaFrac();
bndrycent = &(ebf->getBndryCent());
std::array<const CutFab *, AMREX_SPACEDIM> areafrac;
const CutFab * bndrycent;

for (int d = 0; d < AMREX_SPACEDIM; ++d) {
areafrac[d] = &(*ebf->getAreaFrac()[d])[mfi];
}
bndrycent = &(ebf->getBndryCent()[mfi]);

#ifdef AMREX_USE_GPU
std::unique_ptr<EBCellFlagFab> host_flag;
if (my_flag.arena()->isManaged() || my_flag.arena()->isDevice()) {
host_flag = std::make_unique<EBCellFlagFab>(my_flag.box(), my_flag.nComp(),
The_Pinned_Arena());
Gpu::dtoh_memcpy_async(host_flag->dataPtr(), my_flag.dataPtr(),
host_flag->nBytes());
Gpu::streamSynchronize();
my_flag_ptr = host_flag.get();
}

std::array<std::unique_ptr<CutFab>, AMREX_SPACEDIM> areafrac_h;
for (int d = 0; d < AMREX_SPACEDIM; ++d) {
if (areafrac[d]->arena()->isManaged() || areafrac[d]->arena()->isDevice()) {
areafrac_h[d] = std::make_unique<CutFab>(areafrac[d]->box(), areafrac[d]->nComp(),
The_Pinned_Arena());
Gpu::dtoh_memcpy_async(areafrac_h[d]->dataPtr(), areafrac[d]->dataPtr(),
areafrac[d]->size()*sizeof(Real));
Gpu::streamSynchronize();
areafrac[d] = areafrac_h[d].get();
}
}

std::unique_ptr<CutFab> bndrycent_h;
if (bndrycent->arena()->isManaged() || bndrycent->arena()->isDevice()) {
bndrycent_h = std::make_unique<CutFab>(bndrycent->box(), bndrycent->nComp(),
The_Pinned_Arena());
Gpu::dtoh_memcpy_async(bndrycent_h->dataPtr(), bndrycent->dataPtr(),
bndrycent->size()*sizeof(Real));
Gpu::streamSynchronize();
bndrycent = bndrycent_h.get();
}
#endif

eb_to_pvd.EBToPolygon(
problo, dx,
bx, my_flag.const_array(),
bndrycent->const_array(mfi),
areafrac[0]->const_array(mfi),
areafrac[1]->const_array(mfi),
areafrac[2]->const_array(mfi));
bx, my_flag_ptr->const_array(),
bndrycent->const_array(),
areafrac[0]->const_array(),
areafrac[1]->const_array(),
areafrac[2]->const_array());
}

int cpu = ParallelDescriptor::MyProc();
Expand All @@ -58,13 +95,26 @@ void WriteEBSurface (const BoxArray & ba, const DistributionMapping & dmap, cons

const auto & sfab = static_cast<EBFArrayBox const &>(mf_ba[mfi]);
const auto & my_flag = sfab.getEBCellFlagFab();
const auto * my_flag_ptr = &my_flag;

const Box & bx = mfi.validbox();

if (my_flag.getType(bx) == FabType::covered ||
my_flag.getType(bx) == FabType::regular) { continue; }

eb_to_pvd.EBGridCoverage(cpu, problo, dx, bx, my_flag.const_array());
#ifdef AMREX_USE_GPU
std::unique_ptr<EBCellFlagFab> host_flag;
if (my_flag.arena()->isManaged() || my_flag.arena()->isDevice()) {
host_flag = std::make_unique<EBCellFlagFab>(my_flag.box(), my_flag.nComp(),
The_Pinned_Arena());
Gpu::dtoh_memcpy_async(host_flag->dataPtr(), my_flag.dataPtr(),
host_flag->nBytes());
Gpu::streamSynchronize();
my_flag_ptr = host_flag.get();
}
#endif

eb_to_pvd.EBGridCoverage(cpu, problo, dx, bx, my_flag_ptr->const_array());
}
}

Expand Down

0 comments on commit ba95d4c

Please sign in to comment.