aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/ParticleCreation/SmartUtils.cpp
diff options
context:
space:
mode:
authorGravatar Andrew Myers <atmyers2@gmail.com> 2023-04-26 12:17:17 -0700
committerGravatar GitHub <noreply@github.com> 2023-04-26 19:17:17 +0000
commit3991a0e4fe8ff55b9ca0dc68b863794657bd0408 (patch)
tree80a73e42a08155065c800bbc6c67763d643e91c9 /Source/Particles/ParticleCreation/SmartUtils.cpp
parent03bfb024201da4e01a3bf3a2bba3a80dba0cb554 (diff)
downloadWarpX-3991a0e4fe8ff55b9ca0dc68b863794657bd0408.tar.gz
WarpX-3991a0e4fe8ff55b9ca0dc68b863794657bd0408.tar.zst
WarpX-3991a0e4fe8ff55b9ca0dc68b863794657bd0408.zip
Don't rely on managed memory in SmartUtils (#3874)
* Don't rely on managed memory in SmartUtils * use different copy * Policies Vector: Explicit Device Copy Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
Diffstat (limited to '')
-rw-r--r--Source/Particles/ParticleCreation/SmartUtils.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/Source/Particles/ParticleCreation/SmartUtils.cpp b/Source/Particles/ParticleCreation/SmartUtils.cpp
index 2ed06b9a2..7e79f58c5 100644
--- a/Source/Particles/ParticleCreation/SmartUtils.cpp
+++ b/Source/Particles/ParticleCreation/SmartUtils.cpp
@@ -7,17 +7,27 @@
*/
#include "SmartUtils.H"
+#include <AMReX_GpuContainers.H>
+
#include <algorithm>
#include <utility>
+#include <vector>
PolicyVec getPolicies (const NameMap& names) noexcept
{
- PolicyVec policies;
- policies.resize(names.size());
+ std::vector<InitializationPolicy> h_policies;
+ h_policies.resize(names.size());
for (const auto& kv : names)
{
- policies[kv.second] = initialization_policies[kv.first];
+ h_policies[kv.second] = initialization_policies[kv.first];
}
+
+ // host-to-device copy
+ PolicyVec policies;
+ policies.resize(names.size());
+ amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, h_policies.begin(), h_policies.end(), policies.begin());
+ amrex::Gpu::Device::streamSynchronize();
+
return policies;
}
@@ -25,6 +35,9 @@ SmartCopyTag getSmartCopyTag (const NameMap& src, const NameMap& dst) noexcept
{
SmartCopyTag tag;
+ std::vector<int> h_src_comps;
+ std::vector<int> h_dst_comps;
+
// we use the fact that maps are sorted
auto i_src = src.begin();
auto i_dst = dst.begin();
@@ -44,12 +57,21 @@ SmartCopyTag getSmartCopyTag (const NameMap& src, const NameMap& dst) noexcept
{
// name is in both...
tag.common_names.push_back(i_src->first);
- tag.src_comps.push_back(i_src->second);
- tag.dst_comps.push_back(i_dst->second);
+ h_src_comps.push_back(i_src->second);
+ h_dst_comps.push_back(i_dst->second);
++i_src;
++i_dst;
}
}
+ // host-to-device copies
+ tag.src_comps.resize(h_src_comps.size());
+ amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, h_src_comps.begin(), h_src_comps.end(), tag.src_comps.begin());
+
+ tag.dst_comps.resize(h_dst_comps.size());
+ amrex::Gpu::copyAsync(amrex::Gpu::hostToDevice, h_dst_comps.begin(), h_dst_comps.end(), tag.dst_comps.begin());
+
+ amrex::Gpu::Device::streamSynchronize();
+
return tag;
}