15 MPI_Comm_rank(MPI_COMM_WORLD, &r);
21 MPI_Comm_size(MPI_COMM_WORLD, &s);
38 std::string v = x.serialize();
41 MPI_Send(v.data(), v.size(), MPI_CHAR,
MPI_HEAD_RANK, 0, MPI_COMM_WORLD);
59 for(
int r=0;r<s;r++) {
63 auto v = MPI_Probe(r, 0, MPI_COMM_WORLD, &status);
64 assert(v == MPI_SUCCESS);
68 int sz; v = MPI_Get_count(&status, MPI_CHAR, &sz);
69 assert(v == MPI_SUCCESS);
70 assert(sz != MPI_UNDEFINED);
74 char* buf =
new char[sz+1];
77 v = MPI_Recv(buf, sz, MPI_CHAR, r, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
78 assert(v == MPI_SUCCESS);
81 std::string ret = buf;
82 out.push_back(T::deserialize(ret));
101 enum WORKER_TAGS { GIVE_ME, TAKE_THIS, DONE };
108 for(
size_t i=0;i<n;) {
111 auto v = MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
113 if(status.MPI_TAG == TAKE_THIS) {
116 char* buf =
new char[sz+1];
119 v = MPI_Recv(buf, sz, MPI_CHAR, r, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
120 assert(v == MPI_SUCCESS);
123 std::string ret = buf;
124 out.push_back(T::deserialize(ret));
127 else if(status.MPI_TAG == GIVE_ME) {
130 MPI_send(buf, 1, MPI_INT, status.MPI_SOURCE, TAKE_THIS, MPI_COMM_WORLD);
134 assert(
false &&
"*** Bad tag");
143 auto v = MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
void mpi_return(T &x)
Return my results via MPI.
Definition: MPI.h:35
int mpi_size()
Definition: MPI.h:19
const size_t MPI_HEAD_RANK
Definition: MPI.h:11
int mpi_rank()
Definition: MPI.h:13
bool is_mpi_head()
Definition: MPI.h:25
std::vector< T > mpi_gather()
Reads all the MPI returns from mpi_return. NOTE that the output does not come with any order guarante...
Definition: MPI.h:52
std::vector< T > mpi_map(const size_t n)
Send an int n to each request. Each requestor can use this to index into some data which they are ass...
Definition: MPI.h:100