vt  1.5.0
(Virtual Transport)
group_info_collective.h
Go to the documentation of this file.
1 /*
2 //@HEADER
3 // *****************************************************************************
4 //
5 // group_info_collective.h
6 // DARMA/vt => Virtual Transport
7 //
8 // Copyright 2019-2024 National Technology & Engineering Solutions of Sandia, LLC
9 // (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S.
10 // Government retains certain rights in this software.
11 //
12 // Redistribution and use in source and binary forms, with or without
13 // modification, are permitted provided that the following conditions are met:
14 //
15 // * Redistributions of source code must retain the above copyright notice,
16 // this list of conditions and the following disclaimer.
17 //
18 // * Redistributions in binary form must reproduce the above copyright notice,
19 // this list of conditions and the following disclaimer in the documentation
20 // and/or other materials provided with the distribution.
21 //
22 // * Neither the name of the copyright holder nor the names of its
23 // contributors may be used to endorse or promote products derived from this
24 // software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 // POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact darma@sandia.gov
39 //
40 // *****************************************************************************
41 //@HEADER
42 */
43 
44 #if !defined INCLUDED_VT_GROUP_COLLECTIVE_GROUP_INFO_COLLECTIVE_H
45 #define INCLUDED_VT_GROUP_COLLECTIVE_GROUP_INFO_COLLECTIVE_H
46 
47 #include "vt/config.h"
48 #include "vt/group/group_common.h"
54 #include "vt/messaging/message.h"
55 
56 #include <memory>
57 #include <list>
58 
59 #include <mpi.h>
60 
61 namespace vt { namespace group {
62 
63 struct InfoColl : virtual InfoBase {
65  using GroupCollectivePtrType = std::unique_ptr<GroupCollective>;
69 
70  explicit InfoColl(bool const in_is_in_group, MPI_Comm default_comm, bool make_mpi_group)
71  : is_in_group(in_is_in_group),
72  default_comm_(default_comm),
73  mpi_group_comm_(default_comm),
74  make_mpi_group_(make_mpi_group)
75  {
76  }
77 
78  virtual ~InfoColl() = default;
79 
80 private:
81  /*
82  * Inner struct used as functor reduce target after the collective group is
83  * fully created a operational: this will be triggered.
84  */
86  void operator()(FinishedReduceMsg* msg);
87  };
88 
89 public:
90  ReducePtrType getReduce() const;
91  NodeType getRoot() const;
92  bool isGroupDefault() const;
93  TreeType* getTree() const;
94  bool inGroup() const;
95  bool isReady() const;
96  void readyAction(ActionType const action);
97  MPI_Comm getComm() const;
98  void freeComm();
99  bool isEmptyGroup() const;
100 
101 protected:
102  void setupCollective();
104 
105  static void upHan(GroupCollectiveMsg* msg);
106  static void downHan(GroupCollectiveMsg* msg);
107  static void newRootHan(GroupCollectiveMsg* msg);
108  static void downFinishedHan(GroupOnlyMsg* msg);
109  static void finalizeHan(GroupOnlyMsg* msg);
110  static void newTreeHan(GroupOnlyMsg* msg);
111  static void tree(GroupOnlyMsg* msg);
112 
113 private:
114  void upTree();
115  void atRoot();
116  void downTree(GroupCollectiveMsg* msg);
118  void newRoot(GroupCollectiveMsg* msg);
119  void downTreeFinished(GroupOnlyMsg* msg);
120  void finalizeTree(GroupOnlyMsg* msg);
121  void finalize();
122  void sendDownNewTree();
123  void newTree(NodeType const& parent);
125 
126 protected:
127  bool is_in_group = false;
128  bool finished_init_ = false;
129  bool in_phase_two_ = false;
132  std::vector<GroupCollMsgPtrType> msgs_ = {};
133  uint32_t arrived_count_ = 0;
134  uint32_t extra_count_ = 0;
135  uint32_t extra_arrived_count_ = 0;
136  uint32_t send_down_ = 0;
137  uint32_t send_down_finished_ = 0;
138  NodeType known_root_node_ = uninitialized_destination;
139  bool is_new_root_ = false;
140  bool has_root_ = false;
141  bool is_default_group_ = false;
142  bool is_empty_group_ = false;
143  std::size_t subtree_ = 0;
144 
145 private:
152 
153 private:
154  std::list<ActionType> pending_ready_actions_ = {};
155 
156 private:
157  //< Default, NON-OWNED, communicator.
158  MPI_Comm default_comm_ = MPI_COMM_NULL;
159  MPI_Comm mpi_group_comm_ = MPI_COMM_NULL;
160  bool make_mpi_group_ = false;
161 };
162 
163 }} /* end namespace vt::group */
164 
165 #endif /*INCLUDED_VT_GROUP_COLLECTIVE_GROUP_INFO_COLLECTIVE_H*/
group_collective_msg.h
vt::group::InfoColl::downFinishedHan
static void downFinishedHan(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:782
vt::group::InfoBase::WaitCountType
int32_t WaitCountType
Definition: group_info_base.h:58
vt::group::InfoColl::finalizeHan
static void finalizeHan(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:786
vt::group::InfoColl::atRoot
void atRoot()
Definition: group_info_collective.cc:234
vt::group::InfoColl::coll_wait_count_
WaitCountType coll_wait_count_
Definition: group_info_collective.h:131
vt::group::InfoColl::tree
static void tree(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:602
vt::group::InfoBase
Definition: group_info_base.h:57
vt::group::InfoColl::collectiveFn
void collectiveFn(MsgSharedPtr< GroupCollectiveMsg > msg)
Definition: group_info_collective.cc:560
vt::group::InfoColl::default_comm_
MPI_Comm default_comm_
Definition: group_info_collective.h:158
vt::group::InfoColl::readyAction
void readyAction(ActionType const action)
Definition: group_info_collective.cc:808
vt::group::InfoColl::known_root_node_
NodeType known_root_node_
Definition: group_info_collective.h:138
vt::group::InfoColl::newRoot
void newRoot(GroupCollectiveMsg *msg)
Definition: group_info_collective.cc:529
vt::ActionType
std::function< void()> ActionType
Used for generically store an action to perform.
Definition: types_type.h:125
vt::config::group
Definition: debug_config.h:76
vt::group::InfoColl::getComm
MPI_Comm getComm() const
Definition: group_info_collective.cc:99
vt::group::InfoColl::InfoColl
InfoColl(bool const in_is_in_group, MPI_Comm default_comm, bool make_mpi_group)
Definition: group_info_collective.h:70
reduce.h
vt::group::InfoColl::CollSetupFinished::operator()
void operator()(FinishedReduceMsg *msg)
Definition: group_collective_finished.cc:53
vt::group::InfoColl::extra_count_
uint32_t extra_count_
Definition: group_info_collective.h:134
vt::group::InfoColl::downHan
static void downHan(GroupCollectiveMsg *msg)
Definition: group_info_collective.cc:774
vt::group::InfoColl::is_empty_group_
bool is_empty_group_
Definition: group_info_collective.h:142
vt::group::InfoColl::is_in_group
bool is_in_group
Definition: group_info_collective.h:127
vt::group::InfoColl::pending_ready_actions_
std::list< ActionType > pending_ready_actions_
Definition: group_info_collective.h:154
vt::group::InfoColl::send_down_finished_
uint32_t send_down_finished_
Definition: group_info_collective.h:137
vt::group::InfoColl::isGroupDefault
bool isGroupDefault() const
Definition: group_info_collective.cc:556
vt::group::InfoColl::getRoot
NodeType getRoot() const
Definition: group_info_collective.cc:542
vt::group::InfoColl::makeCollectiveContinuation
RemoteOperationIDType makeCollectiveContinuation(GroupType const group_)
Definition: group_info_collective.cc:515
vt::group::InfoColl::newRootHan
static void newRootHan(GroupCollectiveMsg *msg)
Definition: group_info_collective.cc:778
vt::NodeType
PhysicalResourceType NodeType
Used to hold the current node/rank or the number of nodes.
Definition: types_type.h:57
vt::group::InfoColl::setupCollective
void setupCollective()
Definition: group_info_collective.cc:112
vt::group::InfoColl::getTree
TreeType * getTree() const
Definition: group_info_collective.cc:816
vt::group::InfoColl::mpi_group_comm_
MPI_Comm mpi_group_comm_
Definition: group_info_collective.h:159
vt::group::InfoColl::freeComm
void freeComm()
Definition: group_info_collective.cc:103
vt::group::InfoColl::up_tree_cont_
RemoteOperationIDType up_tree_cont_
Definition: group_info_collective.h:148
vt::group::InfoColl::finalizeTree
void finalizeTree(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:755
vt::group::InfoColl::msgs_
std::vector< GroupCollMsgPtrType > msgs_
Definition: group_info_collective.h:132
vt::group::GroupCollectiveInfoMsg
Definition: group_collective_msg.h:57
vt::messaging::MsgSharedPtr
Definition: smart_ptr.h:99
vt::group::InfoColl::upTree
void upTree()
Definition: group_info_collective.cc:244
message.h
vt::group::InfoColl::is_default_group_
bool is_default_group_
Definition: group_info_collective.h:141
group_collective.h
vt::group::InfoColl::setupCollectiveSingular
void setupCollectiveSingular()
Definition: group_info_collective.cc:72
vt::group::InfoColl::downTreeFinished
void downTreeFinished(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:769
vt::GroupType
uint64_t GroupType
Used for hold an identifier for a group.
Definition: types_type.h:99
vt::group::InfoColl::isReady
bool isReady() const
Definition: group_info_collective.cc:798
vt::group::InfoColl::getReduce
ReducePtrType getReduce() const
Definition: group_info_collective.cc:794
vt
Definition: activefn.h:51
vt::group::InfoColl::collective_
GroupCollectivePtrType collective_
Definition: group_info_collective.h:130
group_common.h
vt::group::InfoColl
Definition: group_info_collective.h:63
vt::group::InfoColl::new_root_cont_
RemoteOperationIDType new_root_cont_
Definition: group_info_collective.h:151
vt::group::InfoColl::downTree
void downTree(GroupCollectiveMsg *msg)
Definition: group_info_collective.cc:625
group_info_base.h
vt::group::InfoColl::in_phase_two_
bool in_phase_two_
Definition: group_info_collective.h:129
vt::group::InfoColl::down_tree_fin_cont_
RemoteOperationIDType down_tree_fin_cont_
Definition: group_info_collective.h:147
vt::group::InfoColl::subtree_
std::size_t subtree_
Definition: group_info_collective.h:143
group_collective_reduce_msg.h
vt::collective::tree::Tree
General interface for storing a spanning tree.
Definition: tree.h:69
vt::group::GroupMsg<::vt::Message >
vt::group::InfoColl::CollSetupFinished
Definition: group_info_collective.h:85
vt::collective::reduce::Reduce
A specific, isolated reducer instance for a given scope that sequences reduce operations via the redu...
Definition: reduce.h:103
vt::group::InfoColl::inGroup
bool inGroup() const
Definition: group_info_collective.cc:827
vt::group::InfoColl::upHan
static void upHan(GroupCollectiveMsg *msg)
Definition: group_info_collective.cc:609
vt::group::InfoColl::extra_arrived_count_
uint32_t extra_arrived_count_
Definition: group_info_collective.h:135
vt::group::FinishedReduceMsg
Definition: group_collective_reduce_msg.h:54
vt::group::RemoteOperationIDType
size_t RemoteOperationIDType
Definition: group_common.h:56
vt::group::InfoColl::sendDownNewTree
void sendDownNewTree()
Definition: group_info_collective.cc:679
config.h
vt::group::InfoColl::down_tree_cont_
RemoteOperationIDType down_tree_cont_
Definition: group_info_collective.h:146
vt::group::InfoColl::isEmptyGroup
bool isEmptyGroup() const
Definition: group_info_collective.cc:804
vt::group::GroupCollective
Definition: group_collective.h:58
vt::group::InfoColl::newTree
void newTree(NodeType const &parent)
Definition: group_info_collective.cc:651
vt::group::InfoColl::has_root_
bool has_root_
Definition: group_info_collective.h:140
vt::group::InfoColl::send_down_
uint32_t send_down_
Definition: group_info_collective.h:136
vt::group::InfoColl::finalize
void finalize()
Definition: group_info_collective.cc:693
vt::group::InfoColl::newTreeHan
static void newTreeHan(GroupOnlyMsg *msg)
Definition: group_info_collective.cc:790
vt::group::InfoColl::make_mpi_group_
bool make_mpi_group_
Definition: group_info_collective.h:160
vt::group::InfoColl::~InfoColl
virtual ~InfoColl()=default
vt::group::InfoColl::GroupCollectivePtrType
std::unique_ptr< GroupCollective > GroupCollectivePtrType
Definition: group_info_collective.h:65
vt::group::InfoColl::arrived_count_
uint32_t arrived_count_
Definition: group_info_collective.h:133
vt::group::InfoColl::new_tree_cont_
RemoteOperationIDType new_tree_cont_
Definition: group_info_collective.h:150
vt::group::InfoColl::is_new_root_
bool is_new_root_
Definition: group_info_collective.h:139
vt::group::InfoColl::finished_init_
bool finished_init_
Definition: group_info_collective.h:128
vt::group::InfoColl::finalize_cont_
RemoteOperationIDType finalize_cont_
Definition: group_info_collective.h:149