OPAL (Object Oriented Parallel Accelerator Library) 2024.2
OPAL
ManyMasterSplit.h
Go to the documentation of this file.
1#ifndef __ONE_MASTER_SPLIT__
2#define __ONE_MASTER_SPLIT__
3
4#include "mpi.h"
5
6#include "Comm/types.h"
8
9#include "Util/AnsiColors.h"
10#include "Util/CmdArguments.h"
12
13
22template < class TopoDiscoveryStrategy >
23class ManyMasterSplit : protected SplitStrategy, public TopoDiscoveryStrategy {
24
25public:
26
27 ManyMasterSplit(CmdArguments_t args, MPI_Comm comm = MPI_COMM_WORLD)
28 : SplitStrategy(args, comm)
29 {}
30
31
33 {}
34
35
36 virtual void split() {
37
39
40 size_t group_size = num_procs_ / num_masters_;
41 group_id_ = rank_ / group_size;
42 Comm::id_t group_start = group_id_ * group_size;
43
44 // Fix Pilot to core start_group + 1
45 poller_ = group_start;
46
47 // Master and Optimizer fixed to first two cores of group
48 if(rank_ % group_size == 0) {
49
50 role_ = POLLER;
51 leader_ = 0;
52
53 } else if(rank_ % group_size == 1) {
54
56 leader_ = 1;
57
58 } else {
59
60 role_ = WORKER;
61 Comm::localId_t worker_group = ((rank_ % group_size) - 2) /
63
64 leader_ = group_start + 2 + worker_group * num_coworkers_worker_;
65 leader_ = leader_ % group_size;
66 }
67
68 // define coloring for splitting starting with INTERNAL comm
69 colorings_.push_back(group_start + leader_);
70
71 // .. and optimizer -- poller leaders
72 if(role_ == WORKER ||
73 rank_ % group_size != static_cast<size_t>(leader_))
74 colorings_.push_back(MPI_UNDEFINED);
75 else
76 colorings_.push_back(group_id_);
77
78 // .. and worker -- poller leaders
79 if(role_ == OPTIMIZER ||
80 rank_ % group_size != static_cast<size_t>(leader_))
81 colorings_.push_back(MPI_UNDEFINED);
82 else
83 colorings_.push_back(group_id_);
84
85 // .. and finally the "world" communicator
86 if(role_ == WORKER)
87 colorings_.push_back(0);
88 else if(role_ == OPTIMIZER)
89 colorings_.push_back(1);
90 else
91 colorings_.push_back(2);
92
93 //FIXME:
94 if(role_ == POLLER)
95 leader_ = 1;
96 }
97
98 virtual int getNrWorkerGroups() const {
100 }
101
102private:
103
106
108
110 try {
111 num_coworkers_worker_ = cmd_args_->getArg<size_t>("num-coworkers");
112 } catch (OptPilotException &e) {
113 std::cout << AnsiColors::BoldRed << "Could not find 'num-coworkers' "
114 << "in arguments.. Aborting." << AnsiColors::Reset << std::endl;
115 MPI_Abort(getComm(), -111);
116 }
117
118
119 num_masters_ = 1;
120 try {
121 num_masters_ = cmd_args_->getArg<size_t>("num-masters");
122 } catch (OptPilotException &e) {
123 std::cout << AnsiColors::BoldRed << "Could not find 'num-masters' "
124 << "in arguments.. Aborting." << AnsiColors::Reset << std::endl;
125 MPI_Abort(getComm(), -1111);
126 }
127
128 if(num_masters_ == 0 || num_coworkers_worker_ == 0) {
129 std::cout << AnsiColors::BoldRed << "Need at least"
130 << " 1 master and 1 coworker to run.. Aborting." << AnsiColors::Reset << std::endl;
131 MPI_Abort(getComm(), -1111);
132 }
133
134 if(static_cast<size_t>(num_procs_) < num_masters_ *
135 (2 + num_coworkers_worker_)) {
136 std::cout << AnsiColors::BoldRed << "Need at least "
138 << " cores to run.. Aborting." << AnsiColors::Reset << std::endl;
139 MPI_Abort(getComm(), -1111);
140 }
141 }
142
143};
144
145#endif
@ POLLER
Definition Types.h:39
@ OPTIMIZER
Definition Types.h:39
@ WORKER
Definition Types.h:39
std::shared_ptr< CmdArguments > CmdArguments_t
size_t id_t
Definition types.h:28
size_t localId_t
Definition types.h:29
constexpr char Reset[]
Definition AnsiColors.h:5
constexpr char BoldRed[]
Definition AnsiColors.h:6
ManyMasterSplit(CmdArguments_t args, MPI_Comm comm=MPI_COMM_WORLD)
virtual void split()
virtual ~ManyMasterSplit()
virtual int getNrWorkerGroups() const
Get number of worker groups.
Defines an interface for splitter strategy implementations.
int leader_
every core specifies a leader (master is its own leader)
std::vector< unsigned int > colorings_
defines comm splitting
int poller_
every core can specifies a master
CmdArguments_t cmd_args_
MPI_Comm getComm() const