36#ifdef BERTINI2_HAVE_MPI
43#include <boost/archive/binary_iarchive.hpp>
44#include <boost/archive/binary_oarchive.hpp>
54void mpi_send_serialized(MPI_Comm comm,
int dest,
int tag, T
const& obj)
56 std::ostringstream oss;
58 boost::archive::binary_oarchive oa(oss);
61 std::string
const buf = oss.str();
62 MPI_Send(buf.data(),
static_cast<int>(buf.size()), MPI_BYTE, dest, tag, comm);
75int mpi_recv_serialized_any(MPI_Comm comm,
int tag, T& obj)
77 MPI_Status probe_status;
78 MPI_Probe(MPI_ANY_SOURCE, tag, comm, &probe_status);
80 int source = probe_status.MPI_SOURCE;
82 MPI_Get_count(&probe_status, MPI_BYTE, &count);
84 std::string buf(
static_cast<std::size_t
>(count),
'\0');
85 MPI_Status recv_status;
86 MPI_Recv(buf.data(), count, MPI_BYTE, source, tag, comm, &recv_status);
88 std::istringstream iss(buf);
89 boost::archive::binary_iarchive ia(iss);
100void mpi_recv_serialized(MPI_Comm comm,
int source,
int tag, T& obj)
102 MPI_Status probe_status;
103 MPI_Probe(source, tag, comm, &probe_status);
106 MPI_Get_count(&probe_status, MPI_BYTE, &count);
108 std::string buf(
static_cast<std::size_t
>(count),
'\0');
109 MPI_Status recv_status;
110 MPI_Recv(buf.data(), count, MPI_BYTE, source, tag, comm, &recv_status);
112 std::istringstream iss(buf);
113 boost::archive::binary_iarchive ia(iss);
124inline void mpi_broadcast_string(MPI_Comm comm, std::string& s,
int root)
126 int len =
static_cast<int>(s.size());
127 MPI_Bcast(&len, 1, MPI_INT, root, comm);
128 s.resize(
static_cast<std::size_t
>(len));
129 MPI_Bcast(s.data(), len, MPI_CHAR, root, comm);
141void mpi_broadcast_serialized(MPI_Comm comm, T& obj,
int root)
144 MPI_Comm_rank(comm, &rank);
149 std::ostringstream oss;
150 boost::archive::binary_oarchive oa(oss);
155 mpi_broadcast_string(comm, s, root);
159 std::istringstream iss(s);
160 boost::archive::binary_iarchive ia(iss);
Single include point for the MPI C API.
Definition initialize_finalize.hpp:43
Definition algorithm_builder.hpp:36