17 static IpplTimings::TimerRef tbasicOp = IpplTimings::getTimer(
"basicOperations");
18 static IpplTimings::TimerRef tperpReduction = IpplTimings::getTimer(
"perpReduction");
19 static IpplTimings::TimerRef tallReduce = IpplTimings::getTimer(
"allReduce");
20 static IpplTimings::TimerRef tscatter = IpplTimings::getTimer(
"scatterR");
28 IpplTimings::startTimer(tscatter);
29 if (!isFirstRepartition) {
33 IpplTimings::stopTimer(tscatter);
35 IpplTimings::startTimer(tbasicOp);
39 int nprocs = comm.size();
42 std::vector<NDIndex<Dim>> domains = {fl.getDomain()};
43 std::vector<int> procs = {nprocs};
46 std::vector<Tf> reduced, reducedRank;
50 int maxprocs = nprocs;
51 IpplTimings::stopTimer(tbasicOp);
53 while (maxprocs > 1) {
55 IpplTimings::startTimer(tbasicOp);
56 int cutAxis = findCutAxis(domains[it]);
57 IpplTimings::stopTimer(tbasicOp);
60 IpplTimings::startTimer(tperpReduction);
61 reduced.resize(domains[it][cutAxis].length());
62 reducedRank.resize(domains[it][cutAxis].length());
64 std::fill(reducedRank.begin(), reducedRank.end(), 0.0);
65 std::fill(reduced.begin(), reduced.end(), 0.0);
68 perpendicularReduction(reducedRank, cutAxis, domains[it]);
69 IpplTimings::stopTimer(tperpReduction);
72 IpplTimings::startTimer(tallReduce);
73 comm.allreduce(reducedRank.data(), reduced.data(), reducedRank.size(), std::plus<Tf>());
74 IpplTimings::stopTimer(tallReduce);
77 IpplTimings::startTimer(tbasicOp);
80 median = findMedian(reduced);
81 IpplTimings::stopTimer(tbasicOp);
84 IpplTimings::startTimer(tbasicOp);
85 cutDomain(domains, procs, it, cutAxis, median);
89 for (
unsigned int i = 0; i < procs.size(); i++) {
90 if (procs[i] > maxprocs) {
95 IpplTimings::stopTimer(tbasicOp);
98 IpplTimings::startTimer(tperpReduction);
101 IpplTimings::stopTimer(tperpReduction);
105 IpplTimings::startTimer(tbasicOp);
106 for (
const auto& domain : domains) {
107 for (
const auto& axis : domain) {
108 if (axis.length() == 1) {
115 fl.updateLayout(domains);
118 bf_m.updateLayout(fl);
119 IpplTimings::stopTimer(tbasicOp);
135 std::vector<Tf>& rankWeights,
unsigned int cutAxis,
NDIndex<Dim>& dom) {
138 if (lDom[cutAxis].first() > dom[cutAxis].last()
139 || lDom[cutAxis].last() < dom[cutAxis].first()) {
144 int nghost = bf_m.getNghost();
145 const auto data = bf_m.getView();
149 std::max(lDom[cutAxis].first(), dom[cutAxis].first()) - lDom[cutAxis].first() + nghost;
151 std::min(lDom[cutAxis].last(), dom[cutAxis].last()) - lDom[cutAxis].first() + nghost;
154 unsigned int arrayStart = 0;
155 if (dom[cutAxis].first() < lDom[cutAxis].first()) {
156 arrayStart = lDom[cutAxis].first() - dom[cutAxis].first();
160 using exec_space =
typename Field::execution_space;
161 using index_type =
typename RangePolicy<Dim, exec_space>::index_type;
162 Kokkos::Array<index_type, Dim> begin, end;
163 for (
unsigned d = 0; d < Dim; d++) {
168 int inf = std::max(lDom[d].first(), dom[d].first()) - lDom[d].first() + nghost;
169 int sup = std::min(lDom[d].last(), dom[d].last()) - lDom[d].first() + nghost;
181 for (
int i = cutAxisFirst; i <= cutAxisLast; i++) {
183 end[cutAxis] = i + 1;
189 ippl::parallel_reduce(
190 "ORB weight reduction", createRangePolicy<Dim, exec_space>(begin, end),
191 KOKKOS_LAMBDA(
const index_array_type& args, Tf& weight) {
192 weight +=
apply(data, args);
194 Kokkos::Sum<Tf>(tempRes));
198 rankWeights[arrayStart++] = tempRes;
259 using vector_type =
typename mesh_type::vector_type;
261 Kokkos::SpaceAccessibility<
typename Attrib::memory_space,
262 typename Field::memory_space>::accessible,
263 "Particle attribute memory space must be accessible from ORB field memory space");
268 auto view = bf_m.getView();
269 const mesh_type& mesh = bf_m.get_mesh();
272 const int nghost = bf_m.getNghost();
275 const vector_type& dx = mesh.getMeshSpacing();
276 const vector_type& origin = mesh.getOrigin();
277 const vector_type invdx = 1.0 / dx;
279 using policy_type = Kokkos::RangePolicy<size_t, typename Field::execution_space>;
283 auto rview = r.getView();
285 Kokkos::parallel_for(
286 "ParticleAttrib::scatterR", policy_type(0, r.getParticleCount()),
287 KOKKOS_LAMBDA(
const size_t idx) {
297 scatterToField(std::make_index_sequence<1 << Dim>{}, view, wlo, whi, args);
300 bf_m.accumulateHalo();
void cutDomain(std::vector< NDIndex< Dim > > &domains, std::vector< int > &procs, int it, int cutAxis, int median)
Definition OrthogonalRecursiveBisection.hpp:241