Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_DistributionMapping.H
Go to the documentation of this file.
1#ifndef BL_DISTRIBUTIONMAPPING_H
2#define BL_DISTRIBUTIONMAPPING_H
3#include <AMReX_Config.H>
4
10#include <AMReX.H>
11#include <AMReX_Array.H>
12#include <AMReX_Vector.H>
13#include <AMReX_Box.H>
14#include <AMReX_REAL.H>
16
17#include <map>
18#include <limits>
19#include <memory>
20#include <cstddef>
21#include <iosfwd>
22
23namespace amrex {
24
25class BoxArray;
26class MultiFab;
27template <typename T> class FabArray;
28template <typename T> class LayoutData;
29class FabArrayBase;
30
51{
52 public:
53
54 template <typename T> friend class FabArray;
55 friend class FabArrayBase;
56
59
60 struct Ref
61 {
63 Ref () = default;
64
65 explicit Ref (int len) : m_pmap(len) {}
66
67 explicit Ref (const Vector<int>& pmap) : m_pmap(pmap) {}
68
69 explicit Ref (Vector<int>&& pmap) noexcept : m_pmap(std::move(pmap)) {}
70
72
73 void clear () { m_pmap.clear(); m_index_array.clear(); m_ownership.clear(); }
74
77 std::vector<bool> m_ownership;
78 };
79
81 DistributionMapping () noexcept;
82
85
87 DistributionMapping& operator= (const DistributionMapping& rhs) = default;
88
90 DistributionMapping (DistributionMapping&& rhs) noexcept = default;
91
93 DistributionMapping& operator= (DistributionMapping&& rhs) noexcept = default;
94
96 ~DistributionMapping() noexcept = default;
97
103 explicit DistributionMapping (const Vector<int>& pmap);
109 explicit DistributionMapping (Vector<int>&& pmap) noexcept;
116 explicit DistributionMapping (const BoxArray& boxes,
117 int nprocs = ParallelDescriptor::NProcs());
118
120 explicit DistributionMapping (std::shared_ptr<Ref> a_ref);
121
133 const DistributionMapping& d2);
134
144 void define (const BoxArray& boxes, int nprocs = ParallelDescriptor::NProcs());
151 void define (const Vector<int>& pmap);
158 void define (Vector<int>&& pmap) noexcept;
166 [[nodiscard]] const Vector<int>& ProcessorMap () const noexcept;
167
169 [[nodiscard]] Long size () const noexcept { return m_ref->m_pmap.size(); }
171 [[nodiscard]] Long capacity () const noexcept { return Long(m_ref->m_pmap.capacity()); }
173 [[nodiscard]] bool empty () const noexcept { return m_ref->m_pmap.empty(); }
174
176 [[nodiscard]] Long linkCount () const noexcept { return m_ref.use_count(); }
177
179 [[nodiscard]] int operator[] (int index) const noexcept { return m_ref->m_pmap[index]; }
180
182 std::istream& readFrom (std::istream& is);
183
185 std::ostream& writeOn (std::ostream& os) const;
186
188 static void strategy (Strategy how);
189
191 static Strategy strategy ();
192
194 static void SFC_Threshold (int n);
195
197 static int SFC_Threshold ();
198
200 bool operator== (const DistributionMapping& rhs) const noexcept;
201
203 bool operator!= (const DistributionMapping& rhs) const noexcept;
204
214 void SFCProcessorMap (const BoxArray& boxes, const std::vector<Long>& wgts, int nprocs,
215 bool sort=true);
226 void SFCProcessorMap (const BoxArray& boxes, const std::vector<Long>& wgts, int nprocs,
227 Real& efficiency, bool sort=true);
239 void KnapSackProcessorMap (const std::vector<Long>& wgts, int nprocs,
240 Real* efficiency=nullptr,
241 bool do_full_knapsack=true,
242 int nmax=std::numeric_limits<int>::max(),
243 bool sort=true);
256 void KnapSackProcessorMap (const DistributionMapping& olddm,
257 const std::vector<Long>& wgts, Real keep_ratio,
258 Real& old_efficiency, Real& new_efficiency,
259 int nmax=std::numeric_limits<int>::max());
268 void RoundRobinProcessorMap (int nboxes, int nprocs, bool sort=true);
277 void RoundRobinProcessorMap (const std::vector<Long>& wgts, int nprocs, bool sort=true);
278
289 static void Initialize ();
290
292 static void Finalize ();
293
295 static bool SameRefs (const DistributionMapping& lhs,
296 const DistributionMapping& rhs)
297 { return lhs.m_ref == rhs.m_ref; }
298
307 static DistributionMapping makeKnapSack (const MultiFab& weight,
308 int nmax=std::numeric_limits<int>::max());
318 static DistributionMapping makeKnapSack (const MultiFab& weight, Real& eff,
319 int nmax=std::numeric_limits<int>::max());
326 static DistributionMapping makeKnapSack (const Vector<Real>& rcost,
327 int nmax=std::numeric_limits<int>::max());
337 static DistributionMapping makeKnapSack (const Vector<Real>& rcost, Real& eff,
338 int nmax=std::numeric_limits<int>::max(),
339 bool sort=true);
340
365 static DistributionMapping makeKnapSack (const LayoutData<Real>& rcost_local,
366 Real& currentEfficiency, Real& proposedEfficiency,
367 int nmax=std::numeric_limits<int>::max(),
368 bool broadcastToAll=true,
370 Real keep_ratio = Real(0.0));
371
375 static DistributionMapping makeRoundRobin (const MultiFab& weight);
379 static DistributionMapping makeSFC (const MultiFab& weight, bool sort=true);
384 static DistributionMapping makeSFC (const MultiFab& weight, Real& eff, bool sort=true);
386 static DistributionMapping makeSFC (const Vector<Real>& rcost,
387 const BoxArray& ba, bool sort=true);
389 static DistributionMapping makeSFC (const Vector<Real>& rcost,
390 const BoxArray& ba, Real& eff, bool sort=true);
391
412 static DistributionMapping makeSFC (const LayoutData<Real>& rcost_local,
413 Real& currentEfficiency, Real& proposedEfficiency,
414 bool broadcastToAll=true,
416
421 static std::vector<std::vector<int> > makeSFC (const BoxArray& ba,
422 bool use_box_vol=true,
423 int nprocs=ParallelContext::NProcsSub() );
424
432 template <typename T>
434 const std::vector<T>& cost,
435 Real* efficiency);
436
439 static Vector<Long> ConvertCostRealToLong (const Vector<Real>& rcost);
440
442 [[nodiscard]] std::weak_ptr<Ref> getWeakRef () const;
443
444private:
445
446 const Vector<int>& getIndexArray ();
447 const std::vector<bool>& getOwnerShip ();
448
450 void RoundRobinProcessorMap (const BoxArray& boxes, int nprocs);
451 void KnapSackProcessorMap (const BoxArray& boxes, int nprocs);
452 void SFCProcessorMap (const BoxArray& boxes, int nprocs);
453 void RRSFCProcessorMap (const BoxArray& boxes, int nprocs);
454
455 using LIpair = std::pair<Long,int>;
456
457 struct LIpairLT
458 {
459 bool operator () (const LIpair& lhs,
460 const LIpair& rhs) const noexcept
461 {
462 return lhs.first < rhs.first;
463 }
464 };
465
466 struct LIpairGT
467 {
468 bool operator () (const LIpair& lhs,
469 const LIpair& rhs) const noexcept
470 {
471 return lhs.first > rhs.first;
472 }
473 };
474
475 static void Sort (std::vector<LIpair>& vec, bool reverse);
476
477 void RoundRobinDoIt (int nboxes,
478 int nprocs,
479 std::vector<LIpair>* LIpairV = nullptr,
480 bool sort = true);
481
482 void KnapSackDoIt (const std::vector<Long>& wgts,
483 int nprocs,
484 Real& efficiency,
485 bool do_full_knapsack,
486 int nmax=std::numeric_limits<int>::max(),
487 bool sort=true);
488
489 void SFCProcessorMapDoIt (const BoxArray& boxes,
490 const std::vector<Long>& wgts,
491 int nprocs,
492 bool sort=true,
493 Real* efficiency=nullptr);
494
495 void RRSFCDoIt (const BoxArray& boxes,
496 int nprocs);
497
499 static void LeastUsedCPUs (int nprocs, Vector<int>& result);
508 static void LeastUsedTeams (Vector<int>& rteam, Vector<Vector<int> >& rworker,
509 int nteams, int nworkers);
510
512 using PVMF = void (DistributionMapping::*)(const BoxArray &, int);
513
515 static Strategy m_Strategy;
520 static PVMF m_BuildMap;
521
522 //
524 std::shared_ptr<Ref> m_ref;
525
526public:
528 struct RefID {
529 constexpr RefID () noexcept {} // =default does not work due to a clang bug // NOLINT
530 explicit RefID (Ref* data_) noexcept : data(data_) {}
531 bool operator< (const RefID& rhs) const noexcept { return std::less<>{}(data,rhs.data); }
532 bool operator== (const RefID& rhs) const noexcept { return data == rhs.data; }
533 bool operator!= (const RefID& rhs) const noexcept { return data != rhs.data; }
534 [[nodiscard]] const Ref *dataPtr() const noexcept { return data; }
535 void PrintPtr(std::ostream &os) const { os << data << '\n'; }
536 friend std::ostream& operator<< (std::ostream& os, const RefID& id);
537 private:
538 Ref* data = nullptr;
539 };
540
542 [[nodiscard]] RefID getRefID () const noexcept { return RefID { m_ref.get() }; }
543};
544
546
548std::ostream& operator<< (std::ostream& os, const DistributionMapping& pmap);
549
550std::ostream& operator<< (std::ostream& os, const DistributionMapping::RefID& id);
551
565DistributionMapping MakeSimilarDM (const BoxArray& ba, const MultiFab& mf, const IntVect& ng);
566
581DistributionMapping MakeSimilarDM (const BoxArray& ba, const BoxArray& src_ba,
582 const DistributionMapping& src_dm, const IntVect& ng);
583
584template <typename T>
586 const DistributionMapping& dm, const std::vector<T>& cost, Real* efficiency)
587{
588 const int nprocs = ParallelDescriptor::NProcs();
589 Vector<T> wgts(nprocs, T(0));
590
591 const auto nboxes = int(dm.size());
592 for (int ibox = 0; ibox < nboxes; ++ibox) {
593 wgts[dm[ibox]] += cost[ibox];
594 }
595
596 T max_weight = 0;
597 T sum_weight = 0;
598 for (auto const& w : wgts) {
599 max_weight = std::max(w, max_weight);
600 sum_weight += w;
601 }
602
603 AMREX_ASSERT(nprocs > 0 && max_weight > T(0));
604
605 *efficiency = static_cast<Real>(sum_weight) /
606 (static_cast<Real>(nprocs) * static_cast<Real>(max_weight));
607}
608
609}
610
611#endif /*BL_DISTRIBUTIONMAPPING_H*/
Runtime initialization/finalization helpers and global diagnostics.
Fixed-size array types for use on GPU and CPU.
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
Integer-lattice boxes and helpers for defining index-space regions.
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:676
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:51
static void Initialize()
Initializes distribution strategy from ParmParse.
Definition AMReX_DistributionMapping.cpp:109
int operator[](int index) const noexcept
Equivalent to ProcessorMap()[index].
Definition AMReX_DistributionMapping.H:179
static DistributionMapping makeKnapSack(const MultiFab &weight, int nmax=std::numeric_limits< int >::max())
Build a knapsack mapping weighted by the sum of component 0 over each valid box of weight.
Definition AMReX_DistributionMapping.cpp:1733
Long linkCount() const noexcept
Number of references to this DistributionMapping.
Definition AMReX_DistributionMapping.H:176
Long size() const noexcept
Length of the underlying processor map.
Definition AMReX_DistributionMapping.H:169
void define(const BoxArray &boxes, int nprocs=ParallelDescriptor::NProcs())
Build a mapping from a BoxArray using the current strategy.
Definition AMReX_DistributionMapping.cpp:347
static bool SameRefs(const DistributionMapping &lhs, const DistributionMapping &rhs)
Return true if lhs and rhs share the same underlying Ref.
Definition AMReX_DistributionMapping.H:295
static int SFC_Threshold()
Return the SFC threshold; the SFC constructors fall back to knapsack when boxes.size() < threshold*np...
Definition AMReX_DistributionMapping.cpp:91
bool empty() const noexcept
Return true if the processor map is empty.
Definition AMReX_DistributionMapping.H:173
bool operator!=(const DistributionMapping &rhs) const noexcept
Are the distributions different?
Definition AMReX_DistributionMapping.cpp:103
std::ostream & writeOn(std::ostream &os) const
Write the distribution mapping to formatted text stream os.
Definition AMReX_DistributionMapping.cpp:2005
DistributionMapping() noexcept
The default constructor.
Definition AMReX_DistributionMapping.cpp:305
static Vector< Long > ConvertCostRealToLong(const Vector< Real > &rcost)
Definition AMReX_DistributionMapping.cpp:1598
static DistributionMapping makeRoundRobin(const MultiFab &weight)
Build a round-robin map weighted by the sum of component 0 over each valid box of weight.
Definition AMReX_DistributionMapping.cpp:1756
void KnapSackProcessorMap(const std::vector< Long > &wgts, int nprocs, Real *efficiency=nullptr, bool do_full_knapsack=true, int nmax=std::numeric_limits< int >::max(), bool sort=true)
Build a knapsack map from a weight vector.
Definition AMReX_DistributionMapping.cpp:859
bool operator==(const DistributionMapping &rhs) const noexcept
Are the distributions equal?
Definition AMReX_DistributionMapping.cpp:97
static DistributionMapping makeSFC(const MultiFab &weight, bool sort=true)
Build an SFC map weighted by the sum of component 0 over each valid box of weight; sort enables load-...
Definition AMReX_DistributionMapping.cpp:1767
void RoundRobinProcessorMap(int nboxes, int nprocs, bool sort=true)
Build a round-robin map for nboxes boxes.
Definition AMReX_DistributionMapping.cpp:457
void SFCProcessorMap(const BoxArray &boxes, const std::vector< Long > &wgts, int nprocs, bool sort=true)
Build an SFC-ordered map for boxes with per-box weights wgts.
Definition AMReX_DistributionMapping.cpp:1507
const Vector< int > & ProcessorMap() const noexcept
Returns a constant reference to the mapping of boxes in the underlying BoxArray to the CPU that holds...
Definition AMReX_DistributionMapping.cpp:49
RefID getRefID() const noexcept
This gives a unique ID of the reference, which is different from dmID above.
Definition AMReX_DistributionMapping.H:542
static Strategy strategy()
Return the current default DistributionMapping strategy.
Definition AMReX_DistributionMapping.cpp:55
static void Finalize()
Finalize the DistributionMapping subsystem.
Definition AMReX_DistributionMapping.cpp:169
std::weak_ptr< Ref > getWeakRef() const
Return a weak pointer to the underlying Ref (for low-level identity tracking).
Definition AMReX_DistributionMapping.cpp:1951
Strategy
The distribution strategies.
Definition AMReX_DistributionMapping.H:58
@ UNDEFINED
Definition AMReX_DistributionMapping.H:58
@ KNAPSACK
Definition AMReX_DistributionMapping.H:58
@ RRSFC
Definition AMReX_DistributionMapping.H:58
@ ROUNDROBIN
Definition AMReX_DistributionMapping.H:58
@ SFC
Definition AMReX_DistributionMapping.H:58
Long capacity() const noexcept
Reserved capacity of the underlying processor map.
Definition AMReX_DistributionMapping.H:171
std::istream & readFrom(std::istream &is)
Read the distribution mapping from formatted text stream is.
Definition AMReX_DistributionMapping.cpp:1984
static void ComputeDistributionMappingEfficiency(const DistributionMapping &dm, const std::vector< T > &cost, Real *efficiency)
Computes the average cost per MPI rank given a distribution mapping global cost vector.
Definition AMReX_DistributionMapping.H:585
Base class for FabArray.
Definition AMReX_FabArrayBase.H:42
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:344
a one-thingy-per-box distributed object
Definition AMReX_LayoutData.H:13
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
amrex_long Long
Definition AMReX_INT.H:30
int NProcs() noexcept
Definition AMReX_ParallelDescriptor.H:255
int IOProcessorNumber() noexcept
The MPI rank number of the I/O Processor (probably rank 0). This rank is usually used to write to std...
Definition AMReX_ParallelDescriptor.H:279
int NProcsSub() noexcept
number of ranks in current frame
Definition AMReX_ParallelContext.H:74
Definition AMReX_Amr.cpp:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
DistributionMapping MakeSimilarDM(const BoxArray &ba, const MultiFab &mf, const IntVect &ng)
Function that creates a DistributionMapping "similar" to that of a MultiFab.
Definition AMReX_DistributionMapping.cpp:2018
const int[]
Definition AMReX_BLProfiler.cpp:1664
Lightweight identity handle wrapping a pointer to the underlying Ref.
Definition AMReX_DistributionMapping.H:528
constexpr RefID() noexcept
Definition AMReX_DistributionMapping.H:529
friend std::ostream & operator<<(std::ostream &os, const RefID &id)
Definition AMReX_DistributionMapping.cpp:1977
bool operator==(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:532
void PrintPtr(std::ostream &os) const
Definition AMReX_DistributionMapping.H:535
bool operator!=(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:533
const Ref * dataPtr() const noexcept
Definition AMReX_DistributionMapping.H:534
bool operator<(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:531
RefID(Ref *data_) noexcept
Definition AMReX_DistributionMapping.H:530
Definition AMReX_DistributionMapping.H:61
Ref()=default
Constructors to match those in DistributionMapping ....
std::vector< bool > m_ownership
true ownership
Definition AMReX_DistributionMapping.H:77
Ref(const Vector< int > &pmap)
Definition AMReX_DistributionMapping.H:67
Vector< int > m_pmap
index array for all boxes
Definition AMReX_DistributionMapping.H:75
Vector< int > m_index_array
index array for local boxes owned by the team
Definition AMReX_DistributionMapping.H:76
Ref(int len)
Definition AMReX_DistributionMapping.H:65
void clear()
dtor, copy-ctor, copy-op=, move-ctor, and move-op= are compiler generated.
Definition AMReX_DistributionMapping.H:73
Ref(Vector< int > &&pmap) noexcept
Definition AMReX_DistributionMapping.H:69