OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
CommSplitter.h
Go to the documentation of this file.
1 #ifndef __COMM_SPLITTER__
2 #define __COMM_SPLITTER__
3 
4 #include "mpi.h"
5 
6 #include "Comm/types.h"
7 #include "Util/Types.h"
8 #include "Util/CmdArguments.h"
10 
11 //TODO: what is the performance difference between using MPI_COMM_WORLD and
12 // p2p communication vs. communicator groups??
31 template< class Strategy_t >
32 class CommSplitter : public Strategy_t {
33 
34 public:
35 
36  CommSplitter(CmdArguments_t args, MPI_Comm comm = MPI_COMM_WORLD)
37  : Strategy_t(args, comm)
38  , world_comm_(comm)
39  {
40  MPI_Comm_group(world_comm_, &world_group_);
41  MPI_Comm_rank(world_comm_, &global_rank_);
42 
43  // the splitter strategy computes the colorings
44  Strategy_t::split();
45 
46  my_opt_comm_ = MPI_COMM_NULL;
47  my_worker_comm_ = MPI_COMM_NULL;
48  my_coworker_comm_ = MPI_COMM_NULL;
49 
50 
51  MPI_Comm_split(world_comm_, Strategy_t::colorings_[0],
53 
54  MPI_Comm_split(world_comm_, Strategy_t::colorings_[1],
56 
57  MPI_Comm_split(world_comm_, Strategy_t::colorings_[2],
59 
60  MPI_Comm_split(world_comm_, Strategy_t::colorings_[3],
62 
63  // just a precaution to make sure everybody is ready
64  MPI_Barrier(world_comm_);
65  }
66 
67  virtual ~CommSplitter()
68  {
69  MPI_Group_free(&world_group_);
70  if(world_comm_ != MPI_COMM_WORLD)
71  MPI_Comm_free(&world_comm_);
72  }
73 
74  bool isOptimizer() const { return Strategy_t::role_ == OPTIMIZER; }
75  bool isWorker() const { return Strategy_t::role_ == WORKER; }
76  bool isPilot() const { return Strategy_t::role_ == POLLER; }
77 
78  MPI_Comm mpiComm() const { return world_comm_; }
79  int globalRank() const { return global_rank_; }
80  int pilotRank() const { return Strategy_t::poller_; }
81  int getLeader() const { return Strategy_t::leader_; }
82 
83  int getNrWorkerGroups() const { return Strategy_t::getNrWorkerGroups();}
84 
87 
88  Comm::Bundle_t bundle;
89 
90  bundle.island_id = Strategy_t::group_id_;
91 
92  bundle.leader_pid = Strategy_t::leader_;
93  bundle.master_pid = Strategy_t::poller_;
94  //FIXME: is it always 0?
95  bundle.master_local_pid = 0; //poller_local_pid_;
96 
97  bundle.worker = my_worker_comm_;
98  bundle.opt = my_opt_comm_;
100  bundle.world = my_comm_world_;
101 
102  return bundle;
103  }
104 
105 private:
106 
107  MPI_Comm world_comm_;
108  MPI_Group world_group_;
109 
112 
113  // define various communicators for communication between components
114  MPI_Comm my_worker_comm_;
115  MPI_Comm my_opt_comm_;
117  MPI_Comm my_comm_world_;
118 
121 };
122 
123 #endif
MPI_Comm my_coworker_comm_
Definition: CommSplitter.h:116
Comm::Bundle_t getBundle() const
construct comm bundle and return
Definition: CommSplitter.h:86
int island_id
Definition: types.h:15
int pilotRank() const
Definition: CommSplitter.h:80
virtual ~CommSplitter()
Definition: CommSplitter.h:67
MPI_Group world_group_
Definition: CommSplitter.h:108
Definition: Types.h:20
boost::shared_ptr< CmdArguments > CmdArguments_t
Definition: CmdArguments.h:169
int getLeader() const
Definition: CommSplitter.h:81
int master_pid
Definition: types.h:17
MPI_Comm my_worker_comm_
Definition: CommSplitter.h:114
bool isPilot() const
Definition: CommSplitter.h:76
MPI_Comm mpiComm() const
Definition: CommSplitter.h:78
MPI_Comm world
Definition: types.h:22
Role assignment according to strategy (that might use hardware network information).
Definition: CommSplitter.h:32
MPI_Comm my_opt_comm_
Definition: CommSplitter.h:115
bool isWorker() const
Definition: CommSplitter.h:75
MPI_Comm my_comm_world_
Definition: CommSplitter.h:117
bool isOptimizer() const
Definition: CommSplitter.h:74
MPI_Comm worker
Definition: types.h:19
MPI_Comm coworkers
Definition: types.h:21
CommSplitter(CmdArguments_t args, MPI_Comm comm=MPI_COMM_WORLD)
Definition: CommSplitter.h:36
int getNrWorkerGroups() const
Definition: CommSplitter.h:83
Definition: Types.h:20
int global_rank_
global MPI PID
Definition: CommSplitter.h:111
int master_local_pid
Definition: types.h:18
int poller_local_pid_
local (wrt. the communicator group) rank of the master/pilot process
Definition: CommSplitter.h:120
MPI_Comm opt
Definition: types.h:20
MPI_Comm world_comm_
Definition: CommSplitter.h:107
bundles all communicators for a specific role/pid
Definition: types.h:14
int leader_pid
Definition: types.h:16
int globalRank() const
Definition: CommSplitter.h:79