Newer
Older
#include <boost/container/static_vector.hpp>
#include "Configuration.hpp"
#include "MpiEnvironment.hpp"
// creates the graph topology and does the communication
class Communicator {
constexpr static std::size_t NoNeighbors{8};
// for very small container with known max size, this is a performance
// improvement
Thomas Steinreiter
committed
template <typename T>
using Vector = boost::container::static_vector<T, NoNeighbors>;
Thomas Steinreiter
committed
protected:
Vector<int> neighbors_;
Vector<int> sizes_;
Vector<MPI_Datatype> sendTypes_;
const Vector<MPI_Datatype>& recvTypes_{sendTypes_};
Vector<MPI_Aint> sendDisplacements_;
Vector<MPI_Aint> recvDisplacements_;
MPI_Comm commDistGraph_{MPI_COMM_NULL};
MPI_Datatype haloRowType_{};
MPI_Datatype haloColumnType_{};
MPI_Datatype haloCornerType_{MPI_CHAR};
const Size& gridSize, const Size& tileSize);
Thomas Steinreiter
committed
virtual ~Communicator();
void swap(Communicator& first, Communicator& second);
Communicator(Communicator&) = delete;
Communicator& operator=(Communicator&) = delete;
Communicator(Communicator&& other) noexcept;
Communicator& operator=(Communicator&& other) noexcept;
Thomas Steinreiter
committed
virtual void Communicate(State* model) = 0;
virtual MpiRequest AsyncCommunicate(State* model) = 0;