32void writeString(std::ostream& os,
const std::string& s) {
33 os << s.size() <<
' ' << s;
36void readString(std::istream& is, std::string& s) {
48 os << std::setprecision(std::numeric_limits<double>::max_digits10);
50 for (
const auto& kv : params) {
52 writeString(os, kv.first);
53 os <<
' ' << kv.second;
60 for (
const auto& kv : reqvars) {
62 writeString(os, kv.first);
64 kv.second.writeState(os);
71 std::istringstream is(std::string(buffer, buf_size));
75 for (std::size_t i = 0; i < n; ++i) {
87 std::istringstream is(std::string(buffer, buf_size));
91 for (std::size_t i = 0; i < n; ++i) {
103 std::size_t my_pid = 0;
104 MPI_Comm_rank(comm, &pid);
105 my_pid =
static_cast<std::size_t
>(pid);
107 std::size_t buf_size = 0;
108 std::ostringstream os;
110 if (my_pid == root) {
112 buf_size = os.str().length();
115 MPI_Bcast(&buf_size, 1, MPI_UNSIGNED_LONG, root, comm);
117 char *buffer =
new char[buf_size];
118 if (my_pid == root) std::memcpy(buffer, os.str().c_str(), buf_size);
120 MPI_Bcast(buffer, buf_size, MPI_CHAR, root, comm);
121 if (my_pid != root)
deserialize(buffer, buf_size, params);
128 std::ostringstream os;
130 std::size_t buf_size = os.str().length();
132 MPI_Send(&buf_size, 1, MPI_UNSIGNED_LONG, pid,
135 char *buffer =
new char[buf_size];
136 std::memcpy(buffer, os.str().c_str(), buf_size);
138 MPI_Send(buffer, buf_size, MPI_CHAR, pid,
145 MPI_Comm comm, MPI_Request *req) {
147 std::ostringstream os;
149 std::size_t* buf_size =
new std::size_t();
150 *buf_size = os.str().length();
152 MPI_Isend(buf_size, 1, MPI_UNSIGNED_LONG, pid,
155 char *buffer =
new char[*buf_size];
156 std::memcpy(buffer, os.str().c_str(), *buf_size);
158 MPI_Isend(buffer, *buf_size, MPI_CHAR, pid,
161 std::pair<std::size_t*, char*> p(buf_size, buffer);
169 std::size_t buf_size = 0;
170 MPI_Recv(&buf_size, 1, MPI_UNSIGNED_LONG, pid,
173 char *buffer =
new char[buf_size]();
175 MPI_Recv(buffer, buf_size, MPI_CHAR, pid,
185 std::ostringstream os;
187 std::size_t buf_size = os.str().length();
189 MPI_Send(&buf_size, 1, MPI_UNSIGNED_LONG, pid,
192 char *buffer =
new char[buf_size];
193 std::memcpy(buffer, os.str().c_str(), buf_size);
195 MPI_Send(buffer, buf_size, MPI_CHAR, pid,
204 std::size_t buf_size = 0;
205 MPI_Recv(&buf_size, 1, MPI_UNSIGNED_LONG, pid,
208 char *buffer =
new char[buf_size]();
210 MPI_Recv(buffer, buf_size, MPI_CHAR, pid,
std::map< std::string, reqVarInfo_t > reqVarContainer_t
namedVariableCollection_t Param_t
void MPI_Send_reqvars(reqVarContainer_t reqvars, std::size_t pid, MPI_Comm comm)
std::pair< std::size_t *, char * > MPI_ISend_params(Param_t params, std::size_t pid, MPI_Comm comm, MPI_Request *req)
void serialize(Param_t params, std::ostringstream &os)
serializes params to a text stream, replaces boost::serialization
void MPI_Send_params(Param_t params, std::size_t pid, MPI_Comm comm)
void MPI_Recv_reqvars(reqVarContainer_t &reqvars, std::size_t pid, MPI_Comm comm)
void MPI_Recv_params(Param_t ¶ms, std::size_t pid, MPI_Comm comm)
void deserialize(const char *buffer, std::size_t buf_size, Param_t ¶ms)
void MPI_Bcast_params(Param_t ¶ms, std::size_t root, MPI_Comm comm)
broadcast params to all entities in comm
#define MPI_EXCHANGE_SERIALIZED_DATA_TAG
tag for exchanging serialized data