Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#2201: implement memory aware TemperedLB in vt #2203

Closed
wants to merge 73 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
6bc419d
#2201: added enums to specify transfer strategy
ppebay Oct 18, 2023
84f1df0
#2201: created framework to integrate transfer strategy ivar
ppebay Oct 18, 2023
c76d2b1
#2201: added transfer type key to getInputKeysWithHelp()
ppebay Oct 19, 2023
99b5fe0
#2201: addressed PR2203 NS reviww comments
ppebay Nov 18, 2023
64922f3
#2201: Update src/vt/vrt/collection/balance/temperedlb/temperedlb.cc
ppebay Nov 22, 2023
d1dee64
#2201: checkpoint of non-breaking changes (documentation and style)
ppebay Nov 27, 2023
9109ca6
#2201: fixed the incorrect transfer type causing build error
ppebay Nov 28, 2023
b535de5
#2201: added enums to specify transfer strategy
ppebay Oct 18, 2023
0d1096a
#2201: created framework to integrate transfer strategy ivar
ppebay Oct 18, 2023
69b4ee5
#2201: added transfer type key to getInputKeysWithHelp()
ppebay Oct 19, 2023
f84cb28
#2201: addressed PR2203 NS reviww comments
ppebay Nov 18, 2023
1f2d355
#2201: Update src/vt/vrt/collection/balance/temperedlb/temperedlb.cc
ppebay Nov 22, 2023
1765bd5
#2201: args: add arg to force LB to run on the first phase (mainly fo…
lifflander Nov 29, 2023
a77ec7e
#2201: temperedlb: implement basic memory information consumption, th…
lifflander Nov 29, 2023
1f3035d
#2201: temperedlb: add computation for cluster/memory summary
lifflander Nov 29, 2023
0e9edd3
#2201: temperedlb: clear cur_block_ before recomputing the summary
lifflander Nov 29, 2023
68fd7fc
#2201: tools: NOT to merge: for now, add the user-defined problem to …
lifflander Nov 29, 2023
cc384cc
#2201: temperedlb: add missing check for zero cluster size
lifflander Nov 29, 2023
c361dde
#2201: temperedlb: add cluster summary to messages
lifflander Nov 29, 2023
4ce24e3
#2201: temperedlb: add data structures to track other rank's clusters
lifflander Nov 29, 2023
a782c2f
#2201: fixed EOL CI error
ppebay Nov 29, 2023
242547f
#2201: fixed print errors; added pseudocode; and epoch boilerplate
ppebay Nov 29, 2023
f659c3f
#2201: temperedlb: add swap clusters call, fix git history
lifflander Nov 29, 2023
d756fe5
#2201: temperedlb: fix whitespace
lifflander Nov 29, 2023
0a67f7a
#2201: temperedlb: rename cur_blocks_ to cur_clusters_
lifflander Nov 29, 2023
b47b754
#2201: temperedlb: sketch of some code written in the meeting
lifflander Nov 30, 2023
7fb569c
#2201: temperedlb: use new method of getting user data, fix error mes…
lifflander Dec 4, 2023
397d697
#2201: temperedlb: fix indentation
lifflander Dec 4, 2023
ade01e2
#2201: temperedlb: implement locking and swapping protocol--may deadlock
lifflander Dec 5, 2023
190c13f
#2201: temperedlb: fix a couple of bugs
lifflander Dec 5, 2023
864737d
#2201: temperedlb: a hack for now to work around the deadlock problem
lifflander Dec 5, 2023
9b2db6b
#2201: temperedlb: fix bug in the code due to reentrancy causing prob…
lifflander Dec 5, 2023
dacb5b6
#2201: temperedlb: fix bug in code sending memory usage
lifflander Dec 5, 2023
ac0c780
#2201: temperedlb: fix some other minor bugs, add empty cluster "swap"
lifflander Dec 5, 2023
0604a8c
#2201: annotated code for side-by-side comparison with LBAF
ppebay Dec 5, 2023
746d8c9
#2201: annotated following discussion
ppebay Dec 5, 2023
6995e85
#2201: temperedlb: switch a ton of prints to debug prints
lifflander Dec 5, 2023
981505d
#2201: temperedlb: add proper approximation for memory usage for empt…
lifflander Dec 5, 2023
10f8155
#2201: temperedlb: fix bug where some ranks don't participate if they…
lifflander Dec 5, 2023
4c1f80e
#2201: clarify annotation
ppebay Dec 5, 2023
56cd5db
#2201: include infinite value for memory overflow
ppebay Dec 5, 2023
3cabb89
#2201: temperedlb: fix whitespace
lifflander Dec 5, 2023
479fc73
#2201: temperedlb: switch other criterion to use negative inf
lifflander Dec 5, 2023
79e597f
#2201: temperedlb: adding working bytes transfer for correctness
lifflander Dec 5, 2023
b5a2aa0
#2201: temperedlb: add header file comments for the new methods added
lifflander Dec 5, 2023
ccbf6a7
#2201: temperedlb: start implementing sub-clustering
lifflander Dec 6, 2023
47d29c5
#2201: temperedlb: sub-clustering implemented, disabled by default fo…
lifflander Dec 7, 2023
a85ffd5
#2201: reviewed algorithm and annotated for better legibility
ppebay Dec 9, 2023
7a1a0b1
#2201: added tempered criterion when ONLY load transfer is considered
ppebay Dec 9, 2023
b3c6136
#2201: factored out computations of load-based tempered criterion
ppebay Dec 9, 2023
7b56163
#2201: trailing whitespace cleanup
ppebay Dec 9, 2023
a3b9b0c
#2201: temperedlb: dedicated method for memory component of criterion
ppebay Dec 11, 2023
c7554b1
#2201: temperedlb: fixed load criterion implementation and usage
ppebay Dec 12, 2023
527ba37
#2201: temperedlb: add ordered locking protocol
lifflander Dec 12, 2023
aeae20d
#2201: temperedlb: fixed index of phase -2
ppebay Dec 19, 2023
b549e6a
#2201: temperedlb: fix tracing by disabling it during temperedlb
lifflander Jan 16, 2024
f297c87
#2201: temperedlb: read in comm edges and make graph symmetric
lifflander Jan 16, 2024
f5781e6
#2201: temperedlb: add work model and computation for it
lifflander Jan 16, 2024
4b59c32
#2201: temperedlb: add shared IDs to element communication
lifflander Jan 17, 2024
7ccc665
#2201: temperedlb: add getter for rank-based LB data and elm ID for c…
lifflander Jan 17, 2024
7e33711
#2201: temperedlb: add computation for work model for given distribution
lifflander Jan 17, 2024
0abeba9
#2201: temperedlb: add rank working bytes to the inform to improve ap…
lifflander Jan 17, 2024
2df6ab3
#2201: temperedlb: use exact working bytes for approximation of memor…
lifflander Jan 17, 2024
ef51033
#2201: temperedlb: make getRankLBData public
lifflander Jan 17, 2024
1676585
#2201: temperedlb: fix copy-paste error in json type
lifflander Jan 17, 2024
bfe272e
#2201: temperedlb: fully implement the new work model for cluster swaps
lifflander Jan 17, 2024
38e909f
#2201: temperedlb: compute working bytes correctly in criterion
lifflander Jan 18, 2024
ca2589d
#2201: lb_manager: fix offset when run on phase 0
lifflander Jan 18, 2024
0f69ff2
#2201: temperedlb: add the rest of the memory model
lifflander Jan 18, 2024
6751fbc
#2201: temperedlb: switch work breakdown print to debug print
lifflander Jan 18, 2024
58f1241
#2201: temperedlb: add abort if we go over the threshold
lifflander Jan 22, 2024
08a4acd
#2201: temperedlb: add a bunch of prints for debugging
lifflander Jan 22, 2024
10c35df
#2201: temperedlb: set locked while it has a lock to avoid giving a l…
lifflander Jan 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/vt/configs/arguments/app_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ struct AppConfig {
bool vt_lb_self_migration = false;
bool vt_lb_spec = false;
std::string vt_lb_spec_file = "";
bool vt_lb_run_lb_first_phase = false;


bool vt_no_detect_hang = false;
Expand Down
3 changes: 3 additions & 0 deletions src/vt/configs/arguments/args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -481,6 +481,7 @@ void addLbArgs(CLI::App& app, AppConfig& appConfig) {
auto lb_self_migration = "Allow load balancer to migrate objects to the same node";
auto lb_spec = "Enable LB spec file (defines which phases output LB data)";
auto lb_spec_file = "File containing LB spec; --vt_lb_spec to enable";
auto lb_first_phase_info = "Force LB to run on the first phase (phase 0)";
auto s = app.add_flag("--vt_lb", appConfig.vt_lb, lb);
auto t1 = app.add_flag("--vt_lb_quiet", appConfig.vt_lb_quiet, lb_quiet);
auto u = app.add_option("--vt_lb_file_name", appConfig.vt_lb_file_name, lb_file_name)->capture_default_str()->check(CLI::ExistingFile);
Expand All @@ -503,6 +504,7 @@ void addLbArgs(CLI::App& app, AppConfig& appConfig) {
auto lbasm = app.add_flag("--vt_lb_self_migration", appConfig.vt_lb_self_migration, lb_self_migration);
auto lbspec = app.add_flag("--vt_lb_spec", appConfig.vt_lb_spec, lb_spec);
auto lbspecfile = app.add_option("--vt_lb_spec_file", appConfig.vt_lb_spec_file, lb_spec_file)->capture_default_str()->check(CLI::ExistingFile);
auto lb_first_phase = app.add_flag("--vt_lb_run_lb_first_phase", appConfig.vt_lb_run_lb_first_phase, lb_first_phase_info);

// --vt_lb_name excludes --vt_lb_file_name, and vice versa
v->excludes(u);
Expand Down Expand Up @@ -531,6 +533,7 @@ void addLbArgs(CLI::App& app, AppConfig& appConfig) {
lbasm->group(debugLB);
lbspec->group(debugLB);
lbspecfile->group(debugLB);
lb_first_phase->group(debugLB);

// help options deliberately omitted from the debugLB group above so that
// they appear grouped with --vt_help when --vt_help is used
Expand Down
27 changes: 23 additions & 4 deletions src/vt/elm/elm_comm.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ enum struct CommCategory : int8_t {
CollectionToNodeBcast = 5,
NodeToCollectionBcast = 6,
CollectiveToCollectionBcast = 7,
LocalInvoke = 8
LocalInvoke = 8,
WriteShared = 9,
ReadOnlyShared = 10
};

inline NodeType objGetNode(ElementIDStruct const id) {
Expand All @@ -71,6 +73,8 @@ struct CommKey {
struct CollectionTag { };
struct CollectionToNodeTag { };
struct NodeToCollectionTag { };
struct WriteSharedTag { };
struct ReadOnlySharedTag { };

CommKey() = default;
CommKey(CommKey const&) = default;
Expand Down Expand Up @@ -107,12 +111,25 @@ struct CommKey {
cat_(bcast ? CommCategory::NodeToCollectionBcast : CommCategory::NodeToCollection)
{ }

CommKey(
WriteSharedTag,
NodeType in_home, int in_shared_id
) : nto_(in_home), shared_id_(in_shared_id), cat_(CommCategory::WriteShared)
{ }

CommKey(
ReadOnlySharedTag,
NodeType in_home, int in_shared_id
) : nto_(in_home), shared_id_(in_shared_id), cat_(CommCategory::ReadOnlyShared)
{ }

ElementIDStruct from_ = {};
ElementIDStruct to_ = {};

ElementIDStruct edge_id_ = {};
NodeType nfrom_ = uninitialized_destination;
NodeType nto_ = uninitialized_destination;
int shared_id_ = -1;
CommCategory cat_ = CommCategory::SendRecv;

ElementIDStruct fromObj() const { return from_; }
Expand All @@ -121,6 +138,7 @@ struct CommKey {
ElementIDType toNode() const { return nto_; }
ElementIDStruct edgeID() const { return edge_id_; }
CommCategory commCategory() const { return cat_; }
int sharedID() const { return shared_id_; }

bool selfEdge() const { return cat_ == CommCategory::SendRecv and from_ == to_; }
bool offNode() const {
Expand All @@ -140,12 +158,12 @@ struct CommKey {
return
k.from_ == from_ and k.to_ == to_ and
k.nfrom_ == nfrom_ and k.nto_ == nto_ and
k.cat_ == cat_;
k.cat_ == cat_ and k.shared_id_ == shared_id_;
}

template <typename SerializerT>
void serialize(SerializerT& s) {
s | from_ | to_ | nfrom_ | nto_ | cat_ | edge_id_;
s | from_ | to_ | nfrom_ | nto_ | cat_ | edge_id_ | shared_id_;
}
};

Expand Down Expand Up @@ -189,7 +207,8 @@ struct hash<vt::elm::CommKey> {
size_t operator()(vt::elm::CommKey const& in) const {
return std::hash<uint64_t>()(
std::hash<vt::elm::ElementIDStruct>()(in.from_) ^
std::hash<vt::elm::ElementIDStruct>()(in.to_) ^ in.nfrom_ ^ in.nto_
std::hash<vt::elm::ElementIDStruct>()(in.to_) ^ in.nfrom_ ^ in.nto_ ^
in.shared_id_
);
}
};
Expand Down
5 changes: 5 additions & 0 deletions src/vt/elm/elm_id.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
//@HEADER
*/

#include "vt/context/context.h"
#include "vt/elm/elm_id.h"
#include "vt/elm/elm_id_bits.h"

Expand All @@ -58,4 +59,8 @@ NodeType ElementIDStruct::getCurrNode() const {
return curr_node;
}

bool ElementIDStruct::isLocatedOnThisNode() const {
return theContext()->getNode() == curr_node and not isMigratable();
}

}} /* end namespace vt::elm */
1 change: 1 addition & 0 deletions src/vt/elm/elm_id.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ struct ElementIDStruct {
bool isMigratable() const;
NodeType getHomeNode() const;
NodeType getCurrNode() const;
bool isLocatedOnThisNode() const;
};


Expand Down
18 changes: 18 additions & 0 deletions src/vt/elm/elm_lb_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,24 @@ void ElementLBData::sendToEntity(
sendComm(key, bytes);
}

void ElementLBData::addWritableSharedID(
NodeType home, int shared_id, double bytes
) {
elm::CommKey key(elm::CommKey::WriteSharedTag{}, home, shared_id);
phase_comm_[cur_phase_][key].sendMsg(bytes);
subphase_comm_[cur_phase_].resize(cur_subphase_ + 1);
subphase_comm_[cur_phase_].at(cur_subphase_)[key].sendMsg(bytes);
}

void ElementLBData::addReadOnlySharedID(
NodeType home, int shared_id, double bytes
) {
elm::CommKey key(elm::CommKey::ReadOnlySharedTag{}, home, shared_id);
phase_comm_[cur_phase_][key].sendMsg(bytes);
subphase_comm_[cur_phase_].resize(cur_subphase_ + 1);
subphase_comm_[cur_phase_].at(cur_subphase_)[key].sendMsg(bytes);
}

void ElementLBData::sendComm(elm::CommKey key, double bytes) {
phase_comm_[cur_phase_][key].sendMsg(bytes);
subphase_comm_[cur_phase_].resize(cur_subphase_ + 1);
Expand Down
3 changes: 3 additions & 0 deletions src/vt/elm/elm_lb_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ struct ElementLBData {
void sendToEntity(ElementIDStruct to, ElementIDStruct from, double bytes);
void sendComm(elm::CommKey key, double bytes);

void addWritableSharedID(NodeType home, int shared_id, double bytes);
void addReadOnlySharedID(NodeType home, int shared_id, double bytes);

void recvComm(elm::CommKey key, double bytes);
void recvObjData(
ElementIDStruct to_perm,
Expand Down
13 changes: 13 additions & 0 deletions src/vt/messaging/active.h
Original file line number Diff line number Diff line change
Expand Up @@ -1722,6 +1722,19 @@ struct ActiveMessenger : runtime::component::PollableComponent<ActiveMessenger>
MsgSizeType const msg_size
);

public:
/**
* \brief Get the rank-based LB data along with element ID for rank-based work
*
* \return tuple with pointers to each one
*/
auto getRankLBData() {
return std::make_tuple(
&bare_handler_dummy_elm_id_for_lb_data_,
&bare_handler_lb_data_
);
}

private:
# if vt_check_enabled(trace_enabled)
trace::UserEventIDType trace_irecv = trace::no_user_event_id;
Expand Down
44 changes: 44 additions & 0 deletions src/vt/vrt/collection/balance/lb_data_holder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,22 @@ std::unique_ptr<nlohmann::json> LBDataHolder::toJson(PhaseType phase) const {
outputEntity(j["communications"][i]["from"], key.fromObj());
break;
}
case elm::CommCategory::ReadOnlyShared: {
j["communications"][i]["type"] = "ReadOnlyShared";
j["communications"][i]["to"]["type"] = "node";
j["communications"][i]["to"]["id"] = key.toNode();
j["communications"][i]["from"]["type"] = "shared_id";
j["communications"][i]["from"]["id"] = key.sharedID();
break;
}
case elm::CommCategory::WriteShared: {
j["communications"][i]["type"] = "WriteShared";
j["communications"][i]["to"]["type"] = "node";
j["communications"][i]["to"]["id"] = key.toNode();
j["communications"][i]["from"]["type"] = "shared_id";
j["communications"][i]["from"]["id"] = key.sharedID();
break;
}
case elm::CommCategory::LocalInvoke:
case elm::CommCategory::CollectiveToCollectionBcast:
// not currently supported
Expand Down Expand Up @@ -379,6 +395,34 @@ LBDataHolder::LBDataHolder(nlohmann::json const& j)
);
CommVolume vol{bytes, messages};
this->node_comm_[id][key] = vol;
} else if (
type == "ReadOnlyShared" or type == "WriteShared"
) {
vtAssertExpr(comm["from"]["type"] == "shared_id");
vtAssertExpr(comm["to"]["type"] == "node");

CommVolume vol{bytes, messages};
auto to_node = comm["to"]["id"];
vtAssertExpr(to_node.is_number());

auto from_shared_id = comm["from"]["id"];
vtAssertExpr(from_shared_id.is_number());

if (type == "ReadOnlyShared") {
CommKey key(
CommKey::ReadOnlySharedTag{},
static_cast<NodeType>(to_node),
static_cast<int>(from_shared_id)
);
this->node_comm_[id][key] = vol;
} else {
CommKey key(
CommKey::WriteSharedTag{},
static_cast<NodeType>(to_node),
static_cast<int>(from_shared_id)
);
this->node_comm_[id][key] = vol;
}
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion src/vt/vrt/collection/balance/lb_invoke/lb_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,11 @@ LBType LBManager::decideLBToRun(PhaseType phase, bool try_file) {
} else {
auto interval = theConfig()->vt_lb_interval;
vtAssert(interval != 0, "LB Interval must not be 0");
if (phase % interval == 1 || (interval == 1 && phase != 0)) {
vt::PhaseType offset = theConfig()->vt_lb_run_lb_first_phase ? 0 : 1;
if (
phase % interval == offset ||
(interval == 1 && phase != 0)
) {
bool name_match = false;
for (auto&& elm : get_lb_names()) {
if (elm.second == theConfig()->vt_lb_name) {
Expand Down
4 changes: 4 additions & 0 deletions src/vt/vrt/collection/balance/model/composed_model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,8 @@ int ComposedModel::getNumSubphases() const {
return base_->getNumSubphases();
}

CommMapType ComposedModel::getComm(PhaseOffset when) const {
return base_->getComm(when);
}

}}}}
1 change: 1 addition & 0 deletions src/vt/vrt/collection/balance/model/composed_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ class ComposedModel : public LoadModel
bool hasUserData() const override;
ElmUserDataType getUserData(ElementIDStruct object, PhaseOffset when) const override;
unsigned int getNumPastPhasesNeeded(unsigned int look_back) const override;
CommMapType getComm(PhaseOffset offset) const override;

ObjectIterator begin() const override;

Expand Down
11 changes: 11 additions & 0 deletions src/vt/vrt/collection/balance/model/load_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,17 @@ struct LoadModel
*/
virtual void updateLoads(PhaseType last_completed_phase) = 0;

/**
* \brief Provide all the comm info for a given phase
*
* \param[in] when the interval in which comm is desired
*
* \return the comm info
*/
virtual CommMapType getComm(PhaseOffset when) const {
return CommMapType{};
}

/**
* \brief Provide an estimate of the given object's load during a specified interval
*
Expand Down
9 changes: 9 additions & 0 deletions src/vt/vrt/collection/balance/model/raw_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,15 @@ ElmUserDataType RawData::getUserData(ElementIDStruct object, PhaseOffset offset)
}
}

CommMapType RawData::getComm(PhaseOffset offset) const {
auto phase = getNumCompletedPhases() + offset.phases;
if (auto it = proc_comm_->find(phase); it != proc_comm_->end()) {
return it->second;
} else {
return CommMapType{};
}
}

unsigned int RawData::getNumPastPhasesNeeded(unsigned int look_back) const
{
return look_back;
Expand Down
1 change: 1 addition & 0 deletions src/vt/vrt/collection/balance/model/raw_data.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ struct RawData : public LoadModel {
LoadType getRawLoad(ElementIDStruct object, PhaseOffset when) const override;
bool hasUserData() const override { return user_data_ != nullptr; }
ElmUserDataType getUserData(ElementIDStruct object, PhaseOffset when) const override;
CommMapType getComm(PhaseOffset when) const override;

void setLoads(std::unordered_map<PhaseType, LoadMapType> const* proc_load,
std::unordered_map<PhaseType, CommMapType> const* proc_comm,
Expand Down
3 changes: 3 additions & 0 deletions src/vt/vrt/collection/balance/node_lb_data.cc
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,9 @@ getRecvSendDirection(elm::CommKeyType const& comm) {
case elm::CommCategory::CollectiveToCollectionBcast:
case elm::CommCategory::LocalInvoke:
return std::make_pair(ElementIDType{}, ElementIDType{});
case elm::CommCategory::WriteShared:
case elm::CommCategory::ReadOnlyShared:
return std::make_pair(ElementIDType{}, ElementIDType{});
}

vtAssert(false, "Invalid balance::CommCategory enum value");
Expand Down
30 changes: 30 additions & 0 deletions src/vt/vrt/collection/balance/temperedlb/tempered_enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,36 @@ enum struct InformTypeEnum : uint8_t {
AsyncInform = 1
};

/// Enum for the strategy to be used in transfer stage
enum struct TransferTypeEnum : uint8_t {
/**
* \brief Original strategy
*
* Transfer one object per transfer as in original Grapevine approach.
*/
Original = 0,
/**
* \brief Original strategy improved by recursion
*
* When single object transfer is rejected, attempt to recurse in order to
* pull more objects into the transfer and hereby minimize work added by
* said transfer.
* This is especially useful when communication is taken into account, as
* object transfers typically disrupt local vs. global communication edges.
*/
Recursive = 1,
/**
* \brief Form object clusters and attempt to perform swaps.
*
* Object can be clustered including to arbitrary definition, and swaps
* of entire clusters, including the nullset, between ranks are attempted.
* This is especially useful when shared memory constraints are present,
* as breaking shared memory clusters results in higher overall memory
* footprint, in constrast with whole cluster swaps.
*/
SwapClusters = 2,
};

/// Enum for the order in which local objects are considered for transfer
enum struct ObjectOrderEnum : uint8_t {
Arbitrary = 0, //< Arbitrary order: iterate as defined by the unordered_map
Expand Down
Loading
Loading