OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
MPIHelper.h
Go to the documentation of this file.
1 #ifndef __MPIHELPER_H__
2 #define __MPIHELPER_H__
3 
4 #include <vector>
5 #include <map>
6 #include <sstream>
7 #include <mpi.h>
8 
9 #include "Util/Types.h"
10 
11 
13 #define MPI_WORKER_STATUSUPDATE_TAG 0x11
14 #define MPI_WORKER_FINISHED_TAG 0x12
16 #define MPI_WORKER_FINISHED_ACK_TAG 0x13
18 
20 #define MPI_COWORKER_NEW_JOB_TAG 0x14
21 
22 
24 #define MPI_OPT_NEW_JOB_TAG 0x21
25 #define MPI_OPT_JOB_FINISHED_TAG 0x22
27 #define MPI_OPT_CONVERGED_TAG 0x23
29 
30 
32 #define MPI_WORK_JOBID_TAG 0x41
33 #define MPI_WORK_SIZE_TAG 0x42
35 #define MPI_WORK_SIZE_PARAMS 0x43
37 
38 #define MPI_EXCHANGE_SOL_STATE_TAG 0x51
39 #define MPI_EXCHANGE_SOL_STATE_DATA_TAG 0x52
40 #define MPI_EXCHANGE_SOL_STATE_RES_SIZE_TAG 0x53
41 #define MPI_EXCHANGE_SOL_STATE_RES_TAG 0x54
42 
44 #define MPI_STOP_TAG 0x91
45 
47 #define MPI_EXCHANGE_SERIALIZED_DATA_TAG 0x99
48 
49 
50 //FIXME: double information (use static vars or enums)
51 enum MPITag_t {
59 };
60 
62 enum State_t {IDLE = 0, RUNNING = 1};
63 
65 void serialize(Param_t params, std::ostringstream &os);
66 void serialize(reqVarContainer_t params, std::ostringstream &os);
67 
69 void deserialize(char *buffer, Param_t &params);
70 void deserialize(char *buffer, reqVarContainer_t &params);
71 
73 void MPI_Bcast_params(Param_t &params, size_t root, MPI_Comm comm);
74 
76 void MPI_Bcast_reqvars(reqVarContainer_t reqvars, size_t root, MPI_Comm comm);
77 
78 
79 //FIXME: test
80 template<class Data_t>
81 void MPI_Send_serialized(Data_t data, size_t pid, MPI_Comm comm) {
82 
83  std::ostringstream os;
84  serialize(data, os);
85  size_t buf_size = os.str().length();
86 
87  MPI_Send(&buf_size, 1, MPI_LONG, pid,
89 
90  char *buffer = new char[buf_size];
91  memcpy(buffer, os.str().c_str(), buf_size);
92 
93  MPI_Send(buffer, buf_size, MPI_CHAR, pid,
95 
96  delete[] buffer;
97 }
98 
99 template<class Data_t>
100 void MPI_Recv_serialized(Data_t &data, size_t pid, MPI_Comm comm) {
101 
102  MPI_Status status;
103  size_t buf_size = 0;
104  MPI_Recv(&buf_size, 1, MPI_LONG, pid,
105  MPI_EXCHANGE_SERIALIZED_DATA_TAG, comm, &status);
106 
107  char *buffer = new char[buf_size];
108  MPI_Recv(buffer, buf_size, MPI_CHAR, pid,
109  MPI_EXCHANGE_SERIALIZED_DATA_TAG, comm, &status);
110 
111  deserialize(buffer, data);
112  delete[] buffer;
113 }
114 
115 
116 
124 void MPI_Send_params(Param_t params, size_t pid, MPI_Comm comm);
125 
136 std::pair<size_t*, char*> MPI_ISend_params(Param_t params, size_t pid,
137  MPI_Comm comm, MPI_Request *req);
138 
146 void MPI_Recv_params(Param_t &params, size_t pid, MPI_Comm comm);
147 
155 void MPI_Send_reqvars(reqVarContainer_t reqvars, size_t pid, MPI_Comm comm);
156 
165 void MPI_Recv_reqvars(reqVarContainer_t &reqvars, size_t pid, MPI_Comm comm);
166 
167 #endif
void MPI_Send_serialized(Data_t data, size_t pid, MPI_Comm comm)
Definition: MPIHelper.h:81
std::map< std::string, reqVarInfo_t > reqVarContainer_t
Definition: Types.h:64
std::pair< size_t *, char * > MPI_ISend_params(Param_t params, size_t pid, MPI_Comm comm, MPI_Request *req)
Definition: MPIHelper.cpp:84
#define MPI_EXCHANGE_SERIALIZED_DATA_TAG
tag for exchanging serialized data
Definition: MPIHelper.h:47
#define MPI_WORKER_STATUSUPDATE_TAG
notify pilot about worker status
Definition: MPIHelper.h:13
#define MPI_WORKER_FINISHED_TAG
notify pilot that work has been finished and results are ready to collect
Definition: MPIHelper.h:15
void serialize(Param_t params, std::ostringstream &os)
serializes params using Boost archive
Definition: MPIHelper.cpp:11
#define MPI_OPT_CONVERGED_TAG
optimizer notifies pilot that optimization has converged (EXIT)
Definition: MPIHelper.h:28
void MPI_Send_reqvars(reqVarContainer_t reqvars, size_t pid, MPI_Comm comm)
Definition: MPIHelper.cpp:125
#define MPI_EXCHANGE_SOL_STATE_RES_SIZE_TAG
Definition: MPIHelper.h:40
#define MPI_EXCHANGE_SOL_STATE_TAG
Definition: MPIHelper.h:38
namedVariableCollection_t Param_t
Definition: Types.h:33
void deserialize(char *buffer, Param_t &params)
deserializes params using Boost archive
Definition: MPIHelper.cpp:23
State_t
Worker state is either idle or running.
Definition: MPIHelper.h:62
void MPI_Recv_params(Param_t &params, size_t pid, MPI_Comm comm)
Definition: MPIHelper.cpp:107
void MPI_Send_params(Param_t params, size_t pid, MPI_Comm comm)
Definition: MPIHelper.cpp:66
void MPI_Bcast_reqvars(reqVarContainer_t reqvars, size_t root, MPI_Comm comm)
broadcast requested variables to all entities in comm
void MPI_Recv_serialized(Data_t &data, size_t pid, MPI_Comm comm)
Definition: MPIHelper.h:100
void MPI_Recv_reqvars(reqVarContainer_t &reqvars, size_t pid, MPI_Comm comm)
Definition: MPIHelper.cpp:144
MPITag_t
Definition: MPIHelper.h:51
Definition: MPIHelper.h:62
void MPI_Bcast_params(Param_t &params, size_t root, MPI_Comm comm)
broadcast params to all entities in comm
Definition: MPIHelper.cpp:39
#define MPI_OPT_NEW_JOB_TAG
optimizer sends new job to pilot
Definition: MPIHelper.h:24
#define MPI_OPT_JOB_FINISHED_TAG
pilot tells optimizer that results are ready to collect
Definition: MPIHelper.h:26