8#include <unordered_map>
14#ifdef NF_WITH_MPI_SUPPORT
23#ifdef NF_WITH_MPI_SUPPORT
35using RankCommMap = std::vector<NodeCommMap>;
40using CommMap = std::vector<RankCommMap>;
53 using bufferType = mpi::FullDuplexCommBuffer;
58 Communicator() =
default;
63 ~Communicator() =
default;
72 Communicator(mpi::Environment mpiEnviron, CommMap rankSendMap, CommMap rankReceiveMap)
73 : mpiEnviron_(mpiEnviron), sendMap_(rankSendMap), receiveMap_(rankReceiveMap)
76 mpiEnviron_.sizeRank() == rankSendMap.size(),
77 "Size of rankSendSize does not match MPI size."
80 mpiEnviron_.sizeRank() == rankReceiveMap.size(),
81 "Size of rankReceiveSize does not match MPI size."
91 template<
typename valueType>
92 void startComm(Vector<valueType>& field,
const std::string& commName)
95 !CommBuffer_.contains(commName) || (!CommBuffer_[commName]),
96 "There is already an ongoing communication for key " << commName <<
"."
99 CommBuffer_[commName] = findDuplexBuffer();
100 if (!CommBuffer_[commName])
102 CommBuffer_[commName] = createNewDuplexBuffer();
105 CommBuffer_[commName]->initComm<valueType>(commName);
106 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
108 auto rankBuffer = CommBuffer_[commName]->getSend<valueType>(rank);
109 for (
size_t data = 0; data < sendMap_[rank].size(); ++data)
111 field.view()[
static_cast<localIdx>(sendMap_[rank][data].local_idx)];
113 CommBuffer_[commName]->startComm();
121 bool isComplete(std::string commName);
129 template<
typename valueType>
130 void finaliseComm(Vector<valueType>& field, std::string commName)
133 CommBuffer_.contains(commName) && CommBuffer_[commName],
134 "No communication associated with key: " << commName
137 CommBuffer_[commName]->waitComplete();
138 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
140 auto rankBuffer = CommBuffer_[commName]->getReceive<valueType>(rank);
141 for (
size_t data = 0; data < receiveMap_[rank].size(); ++data)
142 field.view()[
static_cast<localIdx>(receiveMap_[rank][data].local_idx)] =
145 CommBuffer_[commName]->finaliseComm();
146 CommBuffer_[commName] =
nullptr;
151 mpi::Environment mpiEnviron_;
154 std::vector<bufferType> buffers;
155 std::unordered_map<std::string, bufferType*>
163 bufferType* findDuplexBuffer();
169 bufferType* createNewDuplexBuffer();
#define NF_DEBUG_ASSERT(condition, message)
Macro for asserting a condition and printing an error message if the condition is false (only in debu...
Integer types used throughout NeoN.