21#ifndef MPI_SERIALIZER_HPP
22#define MPI_SERIALIZER_HPP
24#include <opm/common/utility/Serializer.hpp>
41 : Serializer<Mpi::Packer>(m_packer)
46 template<
typename... 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;
Class for serializing and broadcasting data using MPI.
Definition: MPISerializer.hpp:38
void append(T &data, int root=0)
Serialize and broadcast on root process, de-serialize and append on others.
Definition: MPISerializer.hpp:82
void broadcast(RootRank rootrank, Args &&... args)
Definition: MPISerializer.hpp:47
MpiSerializer(Parallel::Communication comm)
Definition: MPISerializer.hpp:40
std::size_t pack(const PV &privar)
Definition: priVarsPacking.hpp:31
Definition: MPISerializer.hpp:28
Dune::Communication< MPIComm > Communication
Definition: ParallelCommunication.hpp:30
Avoid mistakes in calls to broadcast() by wrapping the root argument in an explicit type.
Definition: MPISerializer.hpp:33
int value
Definition: MPISerializer.hpp:34