38class MpiSerializer :
public Serializer<Mpi::Packer> {
40 explicit MpiSerializer(Parallel::Communication comm)
41 : Serializer<Mpi::Packer>(m_packer)
46 template<
typename... Args>
47 void broadcast(
RootRank rootrank, Args&&... args)
49 if (m_comm.size() == 1)
52 const int root = rootrank.value;
53 if (m_comm.rank() == root) {
55 this->pack(std::forward<Args>(args)...);
56 m_comm.broadcast(&m_packSize, 1, root);
57 broadcast_chunked(root);
59 m_packSize = std::numeric_limits<size_t>::max();
60 m_comm.broadcast(&m_packSize, 1, root);
64 m_comm.broadcast(&m_packSize, 1, root);
65 if (m_packSize == std::numeric_limits<size_t>::max()) {
66 throw std::runtime_error(
"Error detected in parallel serialization");
68 m_buffer.resize(m_packSize);
69 broadcast_chunked(root);
70 this->unpack(std::forward<Args>(args)...);
84 if (m_comm.size() == 1)
88 T& bcast = m_comm.rank() == root ? data : tmp;
91 if (m_comm.rank() != root)
96 void broadcast_chunked(
int root) {
97 const int maxChunkSize = std::numeric_limits<int>::max();
98 std::size_t remainingSize = m_packSize;
100 while (remainingSize > maxChunkSize) {
101 m_comm.broadcast(m_buffer.data()+pos, maxChunkSize, root);
103 remainingSize -= maxChunkSize;
105 m_comm.broadcast(m_buffer.data()+pos,
static_cast<int>(remainingSize), root);
108 const Mpi::Packer m_packer;
109 Parallel::Communication m_comm;
void append(T &data, int root=0)
Serialize and broadcast on root process, de-serialize and append on others.
Definition MPISerializer.hpp:82