1#ifndef BL_DISTRIBUTIONMAPPING_H
2#define BL_DISTRIBUTIONMAPPING_H
3#include <AMReX_Config.H>
22template <
typename T>
class FabArray;
23template <
typename T>
class LayoutData;
97 int nprocs = ParallelDescriptor::NProcs());
113 void define (const
BoxArray& boxes,
int nprocs = ParallelDescriptor::NProcs());
129 [[nodiscard]]
Long size () const noexcept {
return Long(m_ref->m_pmap.size()); }
131 [[nodiscard]]
bool empty () const noexcept {
return m_ref->m_pmap.empty(); }
134 [[nodiscard]]
Long linkCount () const noexcept {
return m_ref.use_count(); }
137 [[nodiscard]]
int operator[] (
int index)
const noexcept {
return m_ref->m_pmap[index]; }
139 std::istream&
readFrom (std::istream& is);
141 std::ostream&
writeOn (std::ostream& os)
const;
162 Real& efficiency,
bool sort=
true);
164 Real* efficiency=
nullptr,
165 bool do_full_knapsack=
true,
166 int nmax=std::numeric_limits<int>::max(),
169 const std::vector<Long>& wgts,
Real keep_ratio,
170 Real& old_efficiency,
Real& new_efficiency,
171 int nmax=std::numeric_limits<int>::max());
191 {
return lhs.m_ref == rhs.m_ref; }
194 int nmax=std::numeric_limits<int>::max());
196 int nmax=std::numeric_limits<int>::max());
198 int nmax=std::numeric_limits<int>::max());
200 int nmax=std::numeric_limits<int>::max(),
228 Real& currentEfficiency,
Real& proposedEfficiency,
229 int nmax=std::numeric_limits<int>::max(),
230 bool broadcastToAll=
true,
238 const BoxArray& ba,
bool sort=
true);
263 Real& currentEfficiency,
Real& proposedEfficiency,
264 bool broadcastToAll=
true,
272 bool use_box_vol=
true,
282 template <
typename T>
284 const std::vector<T>& cost,
291 [[nodiscard]] std::weak_ptr<Ref>
getWeakRef ()
const;
296 const std::vector<bool>& getOwnerShip ();
302 void RRSFCProcessorMap (
const BoxArray& boxes,
int nprocs);
304 using LIpair = std::pair<Long,int>;
308 bool operator () (
const LIpair& lhs,
309 const LIpair& rhs)
const noexcept
311 return lhs.first < rhs.first;
317 bool operator () (
const LIpair& lhs,
318 const LIpair& rhs)
const noexcept
320 return lhs.first > rhs.first;
324 static void Sort (std::vector<LIpair>& vec,
bool reverse);
326 void RoundRobinDoIt (
int nboxes,
328 std::vector<LIpair>* LIpairV =
nullptr,
331 void KnapSackDoIt (
const std::vector<Long>& wgts,
334 bool do_full_knapsack,
335 int nmax=std::numeric_limits<int>::max(),
338 void SFCProcessorMapDoIt (
const BoxArray& boxes,
339 const std::vector<Long>& wgts,
342 Real* efficiency=
nullptr);
344 void RRSFCDoIt (
const BoxArray& boxes,
348 static void LeastUsedCPUs (
int nprocs, Vector<int>& result);
353 static void LeastUsedTeams (Vector<int>& rteam, Vector<Vector<int> >& rworker,
int nteams,
int nworkers);
364 static PVMF m_BuildMap;
368 std::shared_ptr<Ref> m_ref;
373 explicit RefID (
Ref* data_) noexcept : data(data_) {}
374 bool operator< (
const RefID& rhs)
const noexcept {
return std::less<>{}(data,rhs.data); }
377 [[nodiscard]]
const Ref *
dataPtr() const noexcept {
return data; }
378 void PrintPtr(std::ostream &os)
const { os << data <<
'\n'; }
434 const auto nboxes =
int(dm.
size());
435 for (
int ibox = 0; ibox < nboxes; ++ibox) {
436 wgts[dm[ibox]] += cost[ibox];
441 for (
auto const& w : wgts) {
442 max_weight = std::max(w, max_weight);
448 *efficiency =
static_cast<Real>(sum_weight) /
449 (
static_cast<Real>(nprocs) *
static_cast<Real>(max_weight));
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:567
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
static void Initialize()
Initializes distribution strategy from ParmParse.
Definition AMReX_DistributionMapping.cpp:107
int operator[](int index) const noexcept
Equivalent to ProcessorMap()[index].
Definition AMReX_DistributionMapping.H:137
static DistributionMapping makeKnapSack(const MultiFab &weight, int nmax=std::numeric_limits< int >::max())
Definition AMReX_DistributionMapping.cpp:1722
Long linkCount() const noexcept
Number of references to this DistributionMapping.
Definition AMReX_DistributionMapping.H:134
Long size() const noexcept
Length of the underlying processor map.
Definition AMReX_DistributionMapping.H:129
void define(const BoxArray &boxes, int nprocs=ParallelDescriptor::NProcs())
Build mapping out of BoxArray over nprocs processors. You need to call this if you built your Distrib...
Definition AMReX_DistributionMapping.cpp:345
static bool SameRefs(const DistributionMapping &lhs, const DistributionMapping &rhs)
Definition AMReX_DistributionMapping.H:189
static int SFC_Threshold()
Definition AMReX_DistributionMapping.cpp:89
bool empty() const noexcept
Definition AMReX_DistributionMapping.H:131
bool operator!=(const DistributionMapping &rhs) const noexcept
Are the distributions different?
Definition AMReX_DistributionMapping.cpp:101
std::ostream & writeOn(std::ostream &os) const
Definition AMReX_DistributionMapping.cpp:1994
DistributionMapping() noexcept
The default constructor.
Definition AMReX_DistributionMapping.cpp:303
static Vector< Long > ConvertCostRealToLong(const Vector< Real > &rcost)
Definition AMReX_DistributionMapping.cpp:1589
static DistributionMapping makeRoundRobin(const MultiFab &weight)
Definition AMReX_DistributionMapping.cpp:1745
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)
Definition AMReX_DistributionMapping.cpp:855
bool operator==(const DistributionMapping &rhs) const noexcept
Are the distributions equal?
Definition AMReX_DistributionMapping.cpp:95
static DistributionMapping makeSFC(const MultiFab &weight, bool sort=true)
Definition AMReX_DistributionMapping.cpp:1756
void RoundRobinProcessorMap(int nboxes, int nprocs, bool sort=true)
Definition AMReX_DistributionMapping.cpp:455
void SFCProcessorMap(const BoxArray &boxes, const std::vector< Long > &wgts, int nprocs, bool sort=true)
Definition AMReX_DistributionMapping.cpp:1499
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:47
RefID getRefID() const noexcept
This gives a unique ID of the reference, which is different from dmID above.
Definition AMReX_DistributionMapping.H:385
static Strategy strategy()
Definition AMReX_DistributionMapping.cpp:53
static void Finalize()
Definition AMReX_DistributionMapping.cpp:167
std::weak_ptr< Ref > getWeakRef() const
Definition AMReX_DistributionMapping.cpp:1940
Strategy
The distribution strategies.
Definition AMReX_DistributionMapping.H:50
@ UNDEFINED
Definition AMReX_DistributionMapping.H:50
@ KNAPSACK
Definition AMReX_DistributionMapping.H:50
@ RRSFC
Definition AMReX_DistributionMapping.H:50
@ ROUNDROBIN
Definition AMReX_DistributionMapping.H:50
@ SFC
Definition AMReX_DistributionMapping.H:50
Long capacity() const noexcept
Definition AMReX_DistributionMapping.H:130
std::istream & readFrom(std::istream &is)
Definition AMReX_DistributionMapping.cpp:1973
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:428
Base class for FabArray.
Definition AMReX_FabArrayBase.H:42
An Array of FortranArrayBox(FAB)-like Objects.
Definition AMReX_FabArray.H:347
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:28
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:49
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:2007
const int[]
Definition AMReX_BLProfiler.cpp:1664
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
Definition AMReX_DistributionMapping.H:371
constexpr RefID() noexcept
Definition AMReX_DistributionMapping.H:372
friend std::ostream & operator<<(std::ostream &os, const RefID &id)
Definition AMReX_DistributionMapping.cpp:1966
bool operator==(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:375
void PrintPtr(std::ostream &os) const
Definition AMReX_DistributionMapping.H:378
bool operator!=(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:376
const Ref * dataPtr() const noexcept
Definition AMReX_DistributionMapping.H:377
bool operator<(const RefID &rhs) const noexcept
Definition AMReX_DistributionMapping.H:374
RefID(Ref *data_) noexcept
Definition AMReX_DistributionMapping.H:373
Definition AMReX_DistributionMapping.H:53
Ref()=default
Constructors to match those in DistributionMapping ....
std::vector< bool > m_ownership
true ownership
Definition AMReX_DistributionMapping.H:69
Ref(const Vector< int > &pmap)
Definition AMReX_DistributionMapping.H:59
Vector< int > m_pmap
index array for all boxes
Definition AMReX_DistributionMapping.H:67
Vector< int > m_index_array
index array for local boxes owned by the team
Definition AMReX_DistributionMapping.H:68
Ref(int len)
Definition AMReX_DistributionMapping.H:57
void clear()
dtor, copy-ctor, copy-op=, move-ctor, and move-op= are compiler generated.
Definition AMReX_DistributionMapping.H:65
Ref(Vector< int > &&pmap) noexcept
Definition AMReX_DistributionMapping.H:61