From 27d0ce81a443444e377a11adb719b740789ef60c Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Wed, 26 Jul 2023 14:03:24 -0700 Subject: [PATCH 1/5] use if constexpr in DenseBins --- Src/Particle/AMReX_DenseBins.H | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Src/Particle/AMReX_DenseBins.H b/Src/Particle/AMReX_DenseBins.H index a4fdc14e038..9bef80ef61b 100644 --- a/Src/Particle/AMReX_DenseBins.H +++ b/Src/Particle/AMReX_DenseBins.H @@ -93,18 +93,12 @@ private: template AMREX_GPU_HOST_DEVICE - static auto call_f(F const& f, const_pointer_input_type v, I& index) - noexcept -> decltype(f(v,index)) - { - return f(v,index); - } - - template - AMREX_GPU_HOST_DEVICE - static auto call_f(F const& f, const_pointer_input_type v, I& index) - noexcept -> decltype(f(v[index])) - { - return f(v[index]); + static auto call_f(F const& f, const_pointer_input_type v, I& index) { + if constexpr (IsCallable::value) { + return f(v, index); + } else { + return f(v[index]); + } } public: From df81d7a7fedc490414bb127ebfb4cf4ca9cc5184 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Wed, 26 Jul 2023 14:03:42 -0700 Subject: [PATCH 2/5] use if constexpr in ParticleMesh --- Src/Particle/AMReX_ParticleUtil.H | 143 ++++-------------------------- 1 file changed, 16 insertions(+), 127 deletions(-) diff --git a/Src/Particle/AMReX_ParticleUtil.H b/Src/Particle/AMReX_ParticleUtil.H index 0ddc09b4422..54acdfd6820 100644 --- a/Src/Particle/AMReX_ParticleUtil.H +++ b/Src/Particle/AMReX_ParticleUtil.H @@ -58,141 +58,30 @@ auto call_f (F const& f, return f(p, i); } -// These next several functions are used by ParticleToMesh and MeshToParticle - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.m_aos[i], fabarr, plo, dxi)) -{ - return f(p.m_aos[i], fabarr, plo, dxi); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.m_aos[i], fabarr)) -{ - return f(p.m_aos[i], fabarr); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.m_aos[i], fabarr, plo, dxi)) -{ - return f(p.m_aos[i], fabarr, plo, dxi); -} - -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.m_aos[i], fabarr)) -{ - return f(p.m_aos[i], fabarr); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p.getSuperParticle(i), fabarr, plo, dxi)) -{ - return f(p.getSuperParticle(i), fabarr, plo, dxi); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p.getSuperParticle(i), fabarr)) -{ - return f(p.getSuperParticle(i), fabarr); -} - -// Lambda takes a ConstParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p, i, fabarr)) -{ - return f(p, i, fabarr); -} - -// Lambda takes a ConstParticleTileData -template +// This function is used by ParticleToMesh and MeshToParticle +template class PTDType, int NAR, int NAI> AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto call_f (F const& f, - const ConstParticleTileData& p, + const PTDType& p, const int i, Array4 const& fabarr, GpuArray const& plo, GpuArray const& dxi) noexcept - -> decltype(f(p, i, fabarr, plo, dxi)) { - return f(p, i, fabarr, plo, dxi); -} - -// Lambda takes a ParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept - -> decltype(f(p, i, fabarr, plo, dxi)) -{ - return f(p, i, fabarr, plo, dxi); -} - -// Lambda takes a ParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ParticleTileData& p, - const int i, Array4 const& fabarr, - GpuArray const&, - GpuArray const&) noexcept - -> decltype(f(p, i, fabarr)) -{ - return f(p, i, fabarr); + if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr); + } else if constexpr (IsCallable::value) { + return f(p, i, fabarr, plo, dxi); + } else { + return f(p, i, fabarr); + } } - } /** From f39d78e5b26f5c12649f74e8e1dd461b451b5b15 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Wed, 26 Jul 2023 14:22:59 -0700 Subject: [PATCH 3/5] also do ParticleReduce --- Src/Particle/AMReX_ParticleUtil.H | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Src/Particle/AMReX_ParticleUtil.H b/Src/Particle/AMReX_ParticleUtil.H index 54acdfd6820..45853ff4466 100644 --- a/Src/Particle/AMReX_ParticleUtil.H +++ b/Src/Particle/AMReX_ParticleUtil.H @@ -22,8 +22,23 @@ namespace amrex namespace particle_detail { -// The next several functions are used by ParticleReduce +// This function is used by ParticleReduce +template +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +auto call_f (F const& f, + const ConstParticleTileData& p, + const int i) noexcept +{ + if constexpr (IsCallable::value) { + return f(p.m_aos[i]); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i)); + } else { + return f(p, i); + } +} + /* // Lambda takes a Particle template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE @@ -57,6 +72,7 @@ auto call_f (F const& f, { return f(p, i); } + */ // This function is used by ParticleToMesh and MeshToParticle template class PTDType, int NAR, int NAI> From 5132971d02baf33e734fa11e06e8f457e12eb347 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Wed, 26 Jul 2023 15:23:54 -0700 Subject: [PATCH 4/5] a little cleanup --- Src/Particle/AMReX_ParticleMesh.H | 27 +++++++++- Src/Particle/AMReX_ParticleReduce.H | 19 ++++++- Src/Particle/AMReX_ParticleUtil.H | 83 +---------------------------- 3 files changed, 45 insertions(+), 84 deletions(-) diff --git a/Src/Particle/AMReX_ParticleMesh.H b/Src/Particle/AMReX_ParticleMesh.H index 148df384ee1..75d2cdb4838 100644 --- a/Src/Particle/AMReX_ParticleMesh.H +++ b/Src/Particle/AMReX_ParticleMesh.H @@ -6,8 +6,33 @@ #include #include -namespace amrex +namespace amrex { + +namespace particle_detail { + +template class PTDType, int NAR, int NAI> +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +auto call_f (F const& f, + const PTDType& p, + const int i, Array4 const& fabarr, + GpuArray const& plo, + GpuArray const& dxi) noexcept { + if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.m_aos[i], fabarr); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr, plo, dxi); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i), fabarr); + } else if constexpr (IsCallable::value) { + return f(p, i, fabarr, plo, dxi); + } else { + return f(p, i, fabarr); + } +} +} template ::value, int> foo = 0> void diff --git a/Src/Particle/AMReX_ParticleReduce.H b/Src/Particle/AMReX_ParticleReduce.H index 8a93dba94d7..2c1df48fd0e 100644 --- a/Src/Particle/AMReX_ParticleReduce.H +++ b/Src/Particle/AMReX_ParticleReduce.H @@ -13,8 +13,25 @@ #include -namespace amrex +namespace amrex { + +namespace particle_detail { + +template +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +auto call_f (F const& f, + const ConstParticleTileData& p, + const int i) noexcept { + if constexpr (IsCallable::value) { + return f(p.m_aos[i]); + } else if constexpr (IsCallable::value) { + return f(p.getSuperParticle(i)); + } else { + return f(p, i); + } +} +} /** * \brief A general reduction method for the particles in a ParticleContainer that can run on either CPUs or GPUs. diff --git a/Src/Particle/AMReX_ParticleUtil.H b/Src/Particle/AMReX_ParticleUtil.H index 45853ff4466..0d7f9af776b 100644 --- a/Src/Particle/AMReX_ParticleUtil.H +++ b/Src/Particle/AMReX_ParticleUtil.H @@ -17,88 +17,7 @@ #include -namespace amrex -{ - -namespace particle_detail { - -// This function is used by ParticleReduce -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept -{ - if constexpr (IsCallable::value) { - return f(p.m_aos[i]); - } else if constexpr (IsCallable::value) { - return f(p.getSuperParticle(i)); - } else { - return f(p, i); - } -} - - /* -// Lambda takes a Particle -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p.m_aos[i])) -{ - return f(p.m_aos[i]); -} - -// Lambda takes a SuperParticle -template ::type = 0> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p.getSuperParticle(i))) -{ - return f(p.getSuperParticle(i)); -} - -// Lambda takes a ConstParticleTileData -template -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const ConstParticleTileData& p, - const int i) noexcept - -> decltype(f(p, i)) -{ - return f(p, i); -} - */ - -// This function is used by ParticleToMesh and MeshToParticle -template class PTDType, int NAR, int NAI> -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -auto call_f (F const& f, - const PTDType& p, - const int i, Array4 const& fabarr, - GpuArray const& plo, - GpuArray const& dxi) noexcept -{ - if constexpr (IsCallable::value) { - return f(p.m_aos[i], fabarr, plo, dxi); - } else if constexpr (IsCallable::value) { - return f(p.m_aos[i], fabarr); - } else if constexpr (IsCallable::value) { - return f(p.getSuperParticle(i), fabarr, plo, dxi); - } else if constexpr (IsCallable::value) { - return f(p.getSuperParticle(i), fabarr); - } else if constexpr (IsCallable::value) { - return f(p, i, fabarr, plo, dxi); - } else { - return f(p, i, fabarr); - } -} - -} +namespace amrex { /** * \brief Returns the number of particles that are more than nGrow cells From e682522dd7bf3e63fe7251140955f723633e2a68 Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Wed, 26 Jul 2023 15:38:41 -0700 Subject: [PATCH 5/5] Update Src/Particle/AMReX_DenseBins.H --- Src/Particle/AMReX_DenseBins.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Particle/AMReX_DenseBins.H b/Src/Particle/AMReX_DenseBins.H index 9bef80ef61b..67ff2c1c9c5 100644 --- a/Src/Particle/AMReX_DenseBins.H +++ b/Src/Particle/AMReX_DenseBins.H @@ -93,7 +93,7 @@ private: template AMREX_GPU_HOST_DEVICE - static auto call_f(F const& f, const_pointer_input_type v, I& index) { + static auto call_f (F const& f, const_pointer_input_type v, I& index) { if constexpr (IsCallable::value) { return f(v, index); } else {