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

1052 Implement epoch scopes #1053

Draft
wants to merge 71 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
6c3eeb8
#1052: epoch: fix weird spacing
lifflander Sep 15, 2020
a16b48b
#1052: epoch: remove unused confusing methods
lifflander Sep 15, 2020
32bb68b
#1052: epoch: make a proper component (has state)
lifflander Sep 15, 2020
c5d2f52
#1052: term: use the new epoch component
lifflander Sep 15, 2020
fc5b48f
#1052: tests: remove 'next' which is unused
lifflander Sep 15, 2020
b299bd1
#1052: epoch: make all epoch stuff not inline (move to cc file)
lifflander Sep 15, 2020
eb4d4f7
#1052: epoch: remove includes
lifflander Sep 15, 2020
2b7f372
#1052: epoch: implement bit pattern for scopes
lifflander Sep 15, 2020
a1562da
#1052: epoch: move general constants to general header
lifflander Sep 15, 2020
9a05200
#1052: epoch: implement collective epoch scopes
lifflander Sep 15, 2020
1290cd0
#1052: test: adjust for re-purposed bits in epoch
lifflander Sep 15, 2020
4792699
#1052: epoch: create the new parameterized epoch for dependencies
lifflander Sep 15, 2020
9bef2b6
#1052: termination: adapt to allow epochs to be generated elsewhere
lifflander Sep 15, 2020
e98d9de
#1052: TD: remove parameterized epochs
lifflander Sep 22, 2020
f7e1b13
#1052: epoch: update docs for new component
lifflander Sep 22, 2020
ef8a550
#1052: epoch: add getScope for testing of component
lifflander Sep 22, 2020
f804f9d
#1052: tests: start writing sketch for tests
lifflander Sep 22, 2020
e2db215
#1052: docs: write documentation page for new epoch manager component
lifflander Sep 22, 2020
be275b0
#1052: docs: fix typo
lifflander Sep 23, 2020
4e49cf3
#1052: epoch: rename methods generate*/getNext*
lifflander Sep 23, 2020
8130255
#1052: termination: rename makeEpoch*WithEpoch -> initialze*Epoch
lifflander Sep 23, 2020
3807d05
#1052: termination: fix doxygen for new interface
lifflander Sep 23, 2020
04b7bbe
#1052: epoch: remove scoped data structure for rooted
lifflander Sep 23, 2020
605eec0
#1052: epoch: make getNextEpoch only generate collective ones
lifflander Sep 23, 2020
81547a1
#1052: epoch: re-write scopes properly embedded with propagation
lifflander Sep 23, 2020
df6cb7c
#1052: epoch: add sentinel for no_scope
lifflander Sep 23, 2020
770b2bd
#1052: epoch: use new sentinel value for consistency
lifflander Sep 23, 2020
c9d3776
#1052: epoch: return scope directly
lifflander Sep 23, 2020
9993209
#1052: epoch: invalidate scope during move for proper de-allocation
lifflander Sep 23, 2020
f455847
#1052: epoch: do not call destroy if no_scope sentinel
lifflander Sep 23, 2020
eb5813c
#1052: epoch: add assertion against no_scope case
lifflander Sep 23, 2020
024a431
#1052: termination: fix long-standing bug in IntegralSet; add test
lifflander Sep 23, 2020
9103bfa
#1052: epoch: supply default value on epoch label matching other API
lifflander Sep 23, 2020
9094b63
#1052: epoch: exclude global scope 0 from scopes now that bit is gone
lifflander Sep 23, 2020
4eb5d4d
#1052: epoch: export EpochScopeType into vt namespace
lifflander Sep 23, 2020
c4913a1
#1052: termination: expand check for non-archetypal epochs
lifflander Sep 23, 2020
60ea95e
#1052: termination: protect against any epoch sentinel
lifflander Sep 23, 2020
ef2484a
#1052: termination: fix bug in scope extraction code
lifflander Sep 23, 2020
1dadbad
#1052: test: write two epoch scope tests to start
lifflander Sep 24, 2020
2d72bcb
#1052: test: finish writing the second test with final piece
lifflander Sep 24, 2020
12895a9
#1052: test: rearrange the last test for readability
lifflander Sep 24, 2020
e0cc922
#1052: test: fix typo in comments
lifflander Sep 24, 2020
0908283
#1052: epoch: combine all epoch manip into one file
lifflander Sep 24, 2020
14dde01
#1052: epoch: fix slight bug in loop after excluding global epoch
lifflander Sep 24, 2020
da5e050
#1052: term: add debug prints to theEpoch
lifflander Oct 12, 2020
ce93c5b
#1052: term: fix long standing bug exposed by epoch reinitialization
lifflander Oct 12, 2020
71c6d6d
#1052: term: make some changes for insertable epoch edge case
lifflander Oct 13, 2020
a104557
#1052: term: jump through some loops to finally fix the bug
lifflander Oct 13, 2020
9aaf031
#1052: term: refactor epoch windows to the new component
lifflander Oct 13, 2020
82b2fc1
#1052: term: fix bug in counting non-compressed elements in set
lifflander Oct 13, 2020
4397068
#1052: term: fix strange spacing
lifflander Oct 13, 2020
a87291c
#1052: util: implement a ranged counter for epoch management
lifflander Oct 13, 2020
fb103e6
#1052: term: rewrite EpochWindow and properly use for allocation
lifflander Oct 13, 2020
b670351
#1052: tests: adapt to new epoch api
lifflander Oct 13, 2020
a6c4f20
#1052: runtime: fix merge bug
lifflander Nov 11, 2020
0e960d4
#1052: epoch: fix inclusion header bug
lifflander Nov 11, 2020
e81ce4c
#1052: epoch: fix another inclusion header bug
lifflander Nov 11, 2020
fb9c1b9
#1052: epoch: fix bugs in epoch activation
lifflander Nov 11, 2020
a816db5
#1052: epoch: make changes to support memory footprinting
lifflander Jan 12, 2021
3c3386e
#1052: epoch: refactor bits for rooted and collective
lifflander Jan 14, 2021
138680c
#1052: tests: adjust for epoch bit refactoring
lifflander Jan 14, 2021
ecc1db0
#1052: epoch: start implementing garbage collection
lifflander Jan 27, 2021
c32c33c
#1052: arg: add new GC threshold user-configurable argument
lifflander Feb 4, 2021
1a72154
#1052: epoch: add full explanation of GC protocol
lifflander Feb 4, 2021
70a61de
#1052: epoch: add getters for testing GC
lifflander Feb 4, 2021
e404296
#1052: termination: fix colletive epoch counter for runtime print at end
lifflander Feb 4, 2021
233275d
#1052: debug: add new category for epoch debug prints
lifflander Feb 4, 2021
af54b64
#1052: epoch: finish garbage collection implementation
lifflander Feb 4, 2021
6aeba55
#1052: tests: write first test for epoch garbage collection
lifflander Feb 4, 2021
500c719
#1052: runtime: add missing warning for new --vt_debug_epoch
lifflander Feb 4, 2021
94bfdd6
#1052: epoch: remove old message not used anymore
lifflander Feb 4, 2021
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 cmake/define_build_types.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ set(
CatEnum::vrt_coll | \
CatEnum::group | \
CatEnum::phase | \
CatEnum::epoch | \
CatEnum::broadcast \
"
)
Expand Down
10 changes: 10 additions & 0 deletions docs/md/epoch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
\page epoch Epoch Manager
\brief Manage TD epochs

The epoch manager component `vt::epoch::EpochManip`, accessed via
`vt::theEpoch()`, manages termination epochs that are allocated and deallocated
as a program executes to encapsulate and order distributed work. The epoch
manager controls the bits allocated for these along with scopes (distinct,
collective strands of epoch bit allocation) for generating the bits. The epoch
manager also allows inspection of information embedded in the epoch bit field
`vt::EpochType` that encodes the epoch type, category, scope, rank, etc.
1 change: 1 addition & 0 deletions docs/md/vt.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ management.
| \subpage seq | `vt::theSeq()` | \copybrief seq | @m_class{m-label m-danger} **Experimental** |
| \subpage vrtseq | `vt::theVirtualSeq()` | \copybrief vrtseq | @m_class{m-label m-danger} **Experimental** |
| \subpage term | `vt::theTerm()` | \copybrief term | @m_class{m-label m-success} **Core** |
| \subpage epoch | `vt::theEpoch()` | \copybrief epoch | @m_class{m-label m-success} **Core** |
| \subpage time-trigger | `vt::theTimeTrigger()` | \copybrief time-trigger | @m_class{m-label m-warning} **Optional** |
| \subpage trace | `vt::theTrace()` | \copybrief trace | @m_class{m-label m-warning} **Optional** |
| \subpage stats-reader | `vt::theStatsReader()` | \copybrief stats-reader | @m_class{m-label m-warning} **Optional** |
Expand Down
4 changes: 4 additions & 0 deletions src/vt/configs/arguments/app_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ struct AppConfig {
bool vt_epoch_graph_terse = false;
bool vt_term_rooted_use_ds = false;
bool vt_term_rooted_use_wave = false;
double vt_term_gc_threshold = 0.10;
int64_t vt_hang_freq = 1024;

#if (vt_diagnostics_runtime != 0)
Expand Down Expand Up @@ -200,6 +201,7 @@ struct AppConfig {
bool vt_debug_broadcast = false;
bool vt_debug_objgroup = false;
bool vt_debug_phase = false;
bool vt_debug_epoch = false;

bool vt_debug_print_flush = false;

Expand Down Expand Up @@ -299,6 +301,7 @@ struct AppConfig {
| vt_epoch_graph_terse
| vt_term_rooted_use_ds
| vt_term_rooted_use_wave
| vt_term_gc_threshold
| vt_hang_freq

| vt_pause
Expand Down Expand Up @@ -336,6 +339,7 @@ struct AppConfig {
| vt_debug_group
| vt_debug_broadcast
| vt_debug_objgroup
| vt_debug_epoch

| vt_debug_print_flush

Expand Down
9 changes: 8 additions & 1 deletion src/vt/configs/arguments/args.cc
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@ void ArgConfig::addDebugPrintArgs(CLI::App& app) {
auto cbp = "Enable debug_broadcast = \"" debug_pp(broadcast) "\"";
auto dbp = "Enable debug_objgroup = \"" debug_pp(objgroup) "\"";
auto dcp = "Enable debug_phase = \"" debug_pp(phase) "\"";
auto ddp = "Enable debug_epoch = \"" debug_pp(epoch) "\"";

auto r = app.add_flag("--vt_debug_all", config_.vt_debug_all, rp);
auto r1 = app.add_flag("--vt_debug_verbose", config_.vt_debug_verbose, rq);
Expand Down Expand Up @@ -286,6 +287,7 @@ void ArgConfig::addDebugPrintArgs(CLI::App& app) {
auto cb = app.add_flag("--vt_debug_broadcast", config_.vt_debug_broadcast, cbp);
auto db = app.add_flag("--vt_debug_objgroup", config_.vt_debug_objgroup, dbp);
auto dc = app.add_flag("--vt_debug_phase", config_.vt_debug_phase, dcp);
auto dd = app.add_flag("--vt_debug_epoch", config_.vt_debug_epoch, ddp);
auto debugGroup = "Debug Print Configuration (must be compile-time enabled)";
r->group(debugGroup);
r1->group(debugGroup);
Expand Down Expand Up @@ -321,6 +323,7 @@ void ArgConfig::addDebugPrintArgs(CLI::App& app) {
cb->group(debugGroup);
db->group(debugGroup);
dc->group(debugGroup);
dd->group(debugGroup);

auto dbq = "Always flush VT runtime prints";
auto eb = app.add_flag("--vt_debug_print_flush", config_.vt_debug_print_flush, dbq);
Expand Down Expand Up @@ -412,14 +415,17 @@ void ArgConfig::addTerminationArgs(CLI::App& app) {
auto graph_on = "Output epoch graph to file (DOT) when hang is detected";
auto terse = "Output epoch graph to file in terse mode";
auto progress = "Print termination counts when progress is stalled";
auto gc_thresh = "Set the threshold for garbage collecting used epoch (0.1 -> 10% of total epochs)";
auto hfd = 1024;
auto thresh = 0.1;
auto x = app.add_flag("--vt_no_detect_hang", config_.vt_no_detect_hang, hang);
auto x1 = app.add_flag("--vt_term_rooted_use_ds", config_.vt_term_rooted_use_ds, ds);
auto x2 = app.add_flag("--vt_term_rooted_use_wave", config_.vt_term_rooted_use_wave, wave);
auto x3 = app.add_option("--vt_epoch_graph_on_hang", config_.vt_epoch_graph_on_hang, graph_on, true);
auto x4 = app.add_flag("--vt_epoch_graph_terse", config_.vt_epoch_graph_terse, terse);
auto x5 = app.add_option("--vt_print_no_progress", config_.vt_print_no_progress, progress, true);
auto y = app.add_option("--vt_hang_freq", config_.vt_hang_freq, hang_freq, hfd);
auto y = app.add_option("--vt_hang_freq", config_.vt_hang_freq, hang_freq, hfd);
auto z = app.add_option("--vt_term_gc_threshold", config_.vt_term_gc_threshold, gc_thresh, thresh);
auto debugTerm = "Termination";
x->group(debugTerm);
x1->group(debugTerm);
Expand All @@ -428,6 +434,7 @@ void ArgConfig::addTerminationArgs(CLI::App& app) {
x4->group(debugTerm);
x5->group(debugTerm);
y->group(debugTerm);
z->group(debugTerm);
}

void ArgConfig::addDebuggerArgs(CLI::App& app) {
Expand Down
2 changes: 2 additions & 0 deletions src/vt/configs/debug/debug_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ enum CatEnum : uint64_t {
objgroup = 1ull<<29,
gossiplb = 1ull<<30,
phase = 1ull<<31,
epoch = 1ull<<32
};

enum CtxEnum : uint64_t {
Expand Down Expand Up @@ -120,6 +121,7 @@ vt_option_category_pretty_print(none, "none")
vt_option_category_pretty_print(active, "active")
vt_option_category_pretty_print(barrier, "barrier")
vt_option_category_pretty_print(broadcast, "bcast")
vt_option_category_pretty_print(epoch, "epoch")
vt_option_category_pretty_print(event, "event")
vt_option_category_pretty_print(gen, "general")
vt_option_category_pretty_print(group, "group")
Expand Down
120 changes: 81 additions & 39 deletions src/vt/epoch/epoch.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,22 @@ namespace vt { namespace epoch {
*
* w-1 .............. w-h-1 ...............w-h-c-1 ....................0
* | <EpochHeader> ... | <EpochCategory> ... | <Sequential Epoch ID> |
*
* *where* h = epoch_header_num_bits,
* c = epoch_category_num_bits,
* w = sizeof(EpochType) * 8
* n = sizeof(NodeType) ^ ^ ^
* | .... n .... | ..........|
* <NodeType> <SeqEpochID>
* | \
* *where* h = epoch_header_num_bits, | \
* c = epoch_category_num_bits,| \
* w = sizeof(EpochType) * 8 | \
* n = sizeof(NodeType) ^ 16 ^ 5 ^ [remainder] ^
* / |
* / |
* _______ |
* / \
* | .... n .... | ... scope ... | ...........|
* <NodeType> <EpochScopeType> <SeqEpochID>
*
* +++++++++++++++++++++++++++++++++++++++++++ Rooted Extended Layout ++
*
* <EpochHeader> = <IsRooted> <HasCategory> <IsUser>
* ....3 bits... = ..bit 1.. ...bit 2... ..bit 3..
* <EpochHeader> = <IsRooted> <HasCategory>
* ....3 bits... = ..bit 1.. ...bit 2...
*
* =======================================================================
* \endverbatim
Expand All @@ -82,17 +86,11 @@ namespace vt { namespace epoch {
* \brief The header bit positions for an epoch (\c vt::EpochType)
*/
enum struct eEpochHeader : int8_t {
RootedEpoch = 1,
CategoryEpoch = 2,
UserEpoch = 3
RootedEpoch = 1
};

/// Number of bits for root flag
static constexpr BitCountType const epoch_root_num_bits = 1;
/// Number of bits for category flag
static constexpr BitCountType const epoch_hcat_num_bits = 1;
/// Number of bits for user flag
static constexpr BitCountType const epoch_user_num_bits = 1;

/**
* Important: if you add new types of epoch headers to the preceding enum, you
Expand All @@ -101,6 +99,15 @@ static constexpr BitCountType const epoch_user_num_bits = 1;
*
*/

/**
* \brief The number of bits for all types of categories.
*
* Important: if you add categories to the enum of epoch categories, you must
* ensure the \c epoch_category_num_bits is sufficiently large.
*
*/
static constexpr BitCountType const epoch_category_num_bits = 2;

/**
* \brief These are different categories of epochs that are allowed.
*
Expand All @@ -118,43 +125,78 @@ inline std::ostream& operator<<(std::ostream& os, eEpochCategory const& cat) {
return debug::printEnum<eEpochCategory>(os,cat);
}

/**
* \brief The number of bits for all types of categories.
*
* Important: if you add categories to the enum of epoch categories, you must
* ensure the \c epoch_category_num_bits is sufficiently large.
*
*/
static constexpr BitCountType const epoch_category_num_bits = 2;
/// Holds a epoch scope ID (collectively generated)
using EpochScopeType = uint64_t;

/// The default, global epoch scope
static constexpr EpochScopeType const global_epoch_scope = 0;

// Number of bits allocated for an epoch scope
static constexpr BitCountType const scope_bits = 20;

/// The total number of bits remaining the sequential part of the \c EpochType
static constexpr BitCountType const epoch_seq_num_bits = sizeof(EpochType) * 8 -
(epoch_root_num_bits +
epoch_hcat_num_bits + epoch_user_num_bits +
epoch_category_num_bits + node_num_bits);
/// The limit on number of live scopes at a given time;
/// Scope 0 is the default scope so that is excluded as a valid scope
static constexpr EpochScopeType const scope_limit = (1<<scope_bits) - 1;

/// The scope sentinel
static constexpr EpochScopeType const no_scope = ~0ull;

/// The number of sequential ID bits remaining for a collective \c EpochType
static constexpr BitCountType const epoch_seq_coll_num_bits =
sizeof(EpochType) * 8 -
(epoch_root_num_bits + epoch_category_num_bits + scope_bits);

/// The total number of bits remaining for a rooted \c EpochType
static constexpr BitCountType const epoch_seq_root_num_bits =
sizeof(EpochType) * 8 -
(epoch_root_num_bits + epoch_category_num_bits + scope_bits + node_num_bits);

/**
* \brief Epoch layout enum to help with manipuating the bits
* \brief Epoch layout enum for collective epochs to help with manipulating the
* bits
*
* This describes the layout of the epoch used by \c EpochManip to get/set the
* bits on an \c EpochType field
*/
enum eEpochLayout {
EpochSequential = 0,
EpochNode = eEpochLayout::EpochSequential + epoch_seq_num_bits,
EpochCategory = eEpochLayout::EpochNode + node_num_bits,
EpochUser = eEpochLayout::EpochCategory + epoch_category_num_bits,
EpochHasCategory = eEpochLayout::EpochUser + epoch_user_num_bits,
EpochIsRooted = eEpochLayout::EpochHasCategory + epoch_hcat_num_bits,
EpochSentinelEnd = eEpochLayout::EpochIsRooted
enum eEpochColl {
cEpochSequential = 0,
cEpochScope = eEpochColl::cEpochSequential + epoch_seq_coll_num_bits,
cEpochCategory = eEpochColl::cEpochScope + scope_bits,
cEpochIsRooted = eEpochColl::cEpochCategory + epoch_category_num_bits
};

/**
* The first basic epoch: BasicEpoch, NoCategoryEpoch:
* \brief Epoch layout enum for rooted epochs to help with manipulating the
* bits
*
* This describes the layout of the epoch used by \c EpochManip to get/set the
* bits on an \c EpochType field
*/
enum eEpochRoot {
rEpochSequential = 0,
rEpochNode = eEpochRoot::rEpochSequential + epoch_seq_root_num_bits,
rEpochScope = eEpochRoot::rEpochNode + node_num_bits,
rEpochCategory = eEpochRoot::rEpochScope + scope_bits,
rEpochIsRooted = eEpochRoot::rEpochCategory + epoch_category_num_bits
};

/// The first epoch sequence number
static constexpr EpochType const first_epoch = 1;

/// The default epoch node used for non-rooted epochs
static constexpr NodeType const default_epoch_node = uninitialized_destination;

/// The default epoch category
static constexpr eEpochCategory const default_epoch_category =
eEpochCategory::NoCategoryEpoch;

}} //end namespace vt::epoch

namespace vt {

/// Type for epoch scope bits embedded in an \c EpochType
using EpochScopeType = epoch::EpochScopeType;

} /* end namespace vt */

#endif /*INCLUDED_EPOCH_EPOCH_H*/
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//@HEADER
// *****************************************************************************
//
// epoch_manip_set.h
// epoch_garbage_collect.cc
// DARMA Toolkit v. 1.0.0
// DARMA/vt => Virtual Transport
//
Expand Down Expand Up @@ -42,55 +42,44 @@
//@HEADER
*/

#if !defined INCLUDED_EPOCH_EPOCH_MANIP_SET_H
#define INCLUDED_EPOCH_EPOCH_MANIP_SET_H

#include "vt/config.h"
#include "vt/epoch/epoch.h"
#include "vt/epoch/epoch_garbage_collect.h"
#include "vt/epoch/garbage_collect_msg.h"
#include "vt/epoch/epoch_manip.h"
#include "vt/utils/bits/bits_common.h"
#include "vt/utils/bits/bits_packer.h"
#include "vt/collective/collective_alg.h"

namespace vt { namespace epoch {

/*static*/ inline
void EpochManip::setIsRooted(EpochType& epoch, bool const is_rooted) {
BitPackerType::boolSetField<eEpochLayout::EpochIsRooted,1,EpochType>(epoch,is_rooted);
}
void GarbageCollectTrait::reducedEpochsImpl(GarbageCollectMsg* msg) {
auto const ep = msg->getEpoch();

/*static*/ inline
void EpochManip::setHasCategory(EpochType& epoch, bool const has_cat) {
BitPackerType::boolSetField<eEpochLayout::EpochHasCategory,1,EpochType>(
epoch,has_cat
vt_debug_print(
epoch, node,
"GarbageCollectTrait::reducedEpochsImpl: archetype={:x}\n", ep
);
}

/*static*/ inline
void EpochManip::setIsUser(EpochType& epoch, bool const is_user) {
BitPackerType::boolSetField<eEpochLayout::EpochUser,1,EpochType>(
epoch,is_user
);
}
auto const mask = 0xFFFFFFFF00000000ull;
vtAssert((ep & mask) == ep, "Archetype bits should not extend past 32 bits");
TagType const topbits = static_cast<TagType>(ep >> 32);

/*static*/ inline
void EpochManip::setCategory(EpochType& epoch, eEpochCategory const cat) {
BitPackerType::setField<
eEpochLayout::EpochCategory, epoch_category_num_bits
>(epoch,cat);
}
// Achieve consensus on garbage collecting these epochs
auto scope = theCollective()->makeCollectiveScope(topbits);

/*static*/ inline
void EpochManip::setNode(EpochType& epoch, NodeType const node) {
BitPackerType::setField<eEpochLayout::EpochNode, node_num_bits>(epoch,node);
}
vt_debug_print(
epoch, node,
"reducedEpochsImpl: archetype={:x} start MPI collective: num epochs={}\n",
ep, msg->getVal().getSet().size()
);

scope.mpiCollectiveWait([ep,msg]{
auto window = theEpoch()->getTerminatedWindow(ep);
window->garbageCollect(msg->getVal().getSet());
});

/*static*/ inline
void EpochManip::setSeq(EpochType& epoch, EpochType const seq) {
BitPackerType::setField<
eEpochLayout::EpochSequential, epoch_seq_num_bits
>(epoch,seq);
vt_debug_print(
epoch, node,
"reducedEpochsImpl: archetype={:x} done MPI collective\n", ep
);
}

}} /* end namespace vt::epoch */

#endif /*INCLUDED_EPOCH_EPOCH_MANIP_SET_H*/
Loading