From 1ab82a3dd77863dba5ef14e06b019cfa8ae53e13 Mon Sep 17 00:00:00 2001 From: Roelof Groenewald <40245517+roelof-groenewald@users.noreply.github.com> Date: Fri, 19 Nov 2021 14:37:22 -0800 Subject: added cost of MCC collisions to load balancing calculation (when using Timers) (#2584) --- .../Particles/Collision/BackgroundMCCCollision.cpp | 35 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'Source/Particles/Collision/BackgroundMCCCollision.cpp') diff --git a/Source/Particles/Collision/BackgroundMCCCollision.cpp b/Source/Particles/Collision/BackgroundMCCCollision.cpp index 736f78423..857685985 100644 --- a/Source/Particles/Collision/BackgroundMCCCollision.cpp +++ b/Source/Particles/Collision/BackgroundMCCCollision.cpp @@ -209,18 +209,33 @@ BackgroundMCCCollision::doCollisions (amrex::Real cur_time, MultiParticleContain auto const flvl = species1.finestLevel(); for (int lev = 0; lev <= flvl; ++lev) { + auto cost = WarpX::getCosts(lev); + // firstly loop over particles box by box and do all particle conserving // scattering #ifdef _OPENMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) #endif for (WarpXParIter pti(species1, lev); pti.isValid(); ++pti) { + if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers) + { + amrex::Gpu::synchronize(); + } + amrex::Real wt = amrex::second(); + doBackgroundCollisionsWithinTile(pti); + + if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers) + { + amrex::Gpu::synchronize(); + wt = amrex::second() - wt; + amrex::HostDevice::Atomic::Add( &(*cost)[pti.index()], wt); + } } // secondly perform ionization through the SmartCopyFactory if needed if (ionization_flag) { - doBackgroundIonization(lev, species1, species2); + doBackgroundIonization(lev, cost, species1, species2); } } } @@ -348,8 +363,8 @@ void BackgroundMCCCollision::doBackgroundCollisionsWithinTile void BackgroundMCCCollision::doBackgroundIonization -( int lev, WarpXParticleContainer& species1, - WarpXParticleContainer& species2) +( int lev, amrex::LayoutData* cost, + WarpXParticleContainer& species1, WarpXParticleContainer& species2) { WARPX_PROFILE("BackgroundMCCCollision::doBackgroundIonization()"); @@ -372,6 +387,13 @@ void BackgroundMCCCollision::doBackgroundIonization #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) #endif for (WarpXParIter pti(species1, lev); pti.isValid(); ++pti) { + + if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers) + { + amrex::Gpu::synchronize(); + } + amrex::Real wt = amrex::second(); + auto& elec_tile = species1.ParticlesAt(lev, pti); auto& ion_tile = species2.ParticlesAt(lev, pti); @@ -389,5 +411,12 @@ void BackgroundMCCCollision::doBackgroundIonization setNewParticleIDs(elec_tile, np_elec, num_added); setNewParticleIDs(ion_tile, np_ion, num_added); + + if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers) + { + amrex::Gpu::synchronize(); + wt = amrex::second() - wt; + amrex::HostDevice::Atomic::Add( &(*cost)[pti.index()], wt); + } } } -- cgit v1.2.3