aboutsummaryrefslogtreecommitdiff
path: root/Source/Filter/Filter.cpp
diff options
context:
space:
mode:
authorGravatar Edoardo Zoni <59625522+EZoni@users.noreply.github.com> 2021-07-12 12:37:52 -0700
committerGravatar GitHub <noreply@github.com> 2021-07-12 12:37:52 -0700
commit2107beb1926c66fee40d7bceca98eafafcf9e680 (patch)
tree76fa083f9cf1e8cce4de7926ae15ecc7d6da3667 /Source/Filter/Filter.cpp
parentc78b9ab3a6cbf390e0ca32e80e00ff1d589cc0a4 (diff)
downloadWarpX-2107beb1926c66fee40d7bceca98eafafcf9e680.tar.gz
WarpX-2107beb1926c66fee40d7bceca98eafafcf9e680.tar.zst
WarpX-2107beb1926c66fee40d7bceca98eafafcf9e680.zip
Add Cost Calculations for Cartesian/RZ Filtering (#2074)
* Add Cost Calculations to ApplyFilter * Add Cost Calculations to ApplyStencil * Update Doxygen
Diffstat (limited to 'Source/Filter/Filter.cpp')
-rw-r--r--Source/Filter/Filter.cpp38
1 files changed, 36 insertions, 2 deletions
diff --git a/Source/Filter/Filter.cpp b/Source/Filter/Filter.cpp
index 781dfd804..38b9e681c 100644
--- a/Source/Filter/Filter.cpp
+++ b/Source/Filter/Filter.cpp
@@ -27,18 +27,27 @@ using namespace amrex;
/* \brief Apply stencil on MultiFab (GPU version, 2D/3D).
* \param dstmf Destination MultiFab
* \param srcmf source MultiFab
+ * \param[in] lev mesh refinement level
* \param scomp first component of srcmf on which the filter is applied
* \param dcomp first component of dstmf on which the filter is applied
* \param ncomp Number of components on which the filter is applied.
*/
void
-Filter::ApplyStencil (MultiFab& dstmf, const MultiFab& srcmf, int scomp, int dcomp, int ncomp)
+Filter::ApplyStencil (MultiFab& dstmf, const MultiFab& srcmf, const int lev, int scomp, int dcomp, int ncomp)
{
WARPX_PROFILE("Filter::ApplyStencil(MultiFab)");
ncomp = std::min(ncomp, srcmf.nComp());
+ amrex::LayoutData<amrex::Real>* cost = WarpX::getCosts(lev);
+
for (MFIter mfi(dstmf); mfi.isValid(); ++mfi)
{
+ if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers)
+ {
+ amrex::Gpu::synchronize();
+ }
+ amrex::Real wt = amrex::second();
+
const auto& src = srcmf.array(mfi);
const auto& dst = dstmf.array(mfi);
const Box& tbx = mfi.growntilebox();
@@ -62,6 +71,13 @@ Filter::ApplyStencil (MultiFab& dstmf, const MultiFab& srcmf, int scomp, int dco
// Apply filter
DoFilter(tbx, tmp, dst, 0, dcomp, ncomp);
+
+ if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers)
+ {
+ amrex::Gpu::synchronize();
+ wt = amrex::second() - wt;
+ amrex::HostDevice::Atomic::Add( &(*cost)[mfi.index()], wt);
+ }
}
}
@@ -166,15 +182,19 @@ void Filter::DoFilter (const Box& tbx,
/* \brief Apply stencil on MultiFab (CPU version, 2D/3D).
* \param dstmf Destination MultiFab
* \param srcmf source MultiFab
+ * \param[in] lev mesh refinement level
* \param scomp first component of srcmf on which the filter is applied
* \param dcomp first component of dstmf on which the filter is applied
* \param ncomp Number of components on which the filter is applied.
*/
void
-Filter::ApplyStencil (amrex::MultiFab& dstmf, const amrex::MultiFab& srcmf, int scomp, int dcomp, int ncomp)
+Filter::ApplyStencil (amrex::MultiFab& dstmf, const amrex::MultiFab& srcmf, const int lev, int scomp, int dcomp, int ncomp)
{
WARPX_PROFILE("Filter::ApplyStencil(MultiFab)");
ncomp = std::min(ncomp, srcmf.nComp());
+
+ amrex::LayoutData<amrex::Real>* cost = WarpX::getCosts(lev);
+
#ifdef AMREX_USE_OMP
// never runs on GPU since in the else branch of AMREX_USE_GPU
#pragma omp parallel
@@ -182,6 +202,13 @@ Filter::ApplyStencil (amrex::MultiFab& dstmf, const amrex::MultiFab& srcmf, int
{
FArrayBox tmpfab;
for (MFIter mfi(dstmf,true); mfi.isValid(); ++mfi){
+
+ if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers)
+ {
+ amrex::Gpu::synchronize();
+ }
+ amrex::Real wt = amrex::second();
+
const auto& srcfab = srcmf[mfi];
auto& dstfab = dstmf[mfi];
const Box& tbx = mfi.growntilebox();
@@ -194,6 +221,13 @@ Filter::ApplyStencil (amrex::MultiFab& dstmf, const amrex::MultiFab& srcmf, int
tmpfab.copy(srcfab, ibx, scomp, ibx, 0, ncomp);
// Apply filter
DoFilter(tbx, tmpfab.array(), dstfab.array(), 0, dcomp, ncomp);
+
+ if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers)
+ {
+ amrex::Gpu::synchronize();
+ wt = amrex::second() - wt;
+ amrex::HostDevice::Atomic::Add( &(*cost)[mfi.index()], wt);
+ }
}
}
}