54 explicit MpiBuffer(std::size_t
size)
67 data_.resize(newSize);
74 void send([[maybe_unused]]
unsigned peerRank)
77 MPI_Isend(data_.data(),
78 static_cast<int>(mpiDataSize_),
80 static_cast<int>(peerRank),
93 MPI_Wait(&mpiRequest_, &mpiStatus_);
100 void receive([[maybe_unused]]
unsigned peerRank)
103 MPI_Recv(data_.data(),
104 static_cast<int>(mpiDataSize_),
106 static_cast<int>(peerRank),
119 MPI_Request& request()
120 {
return mpiRequest_; }
127 const MPI_Request& request()
const
128 {
return mpiRequest_; }
136 {
return mpiStatus_; }
143 const MPI_Status& status()
const
144 {
return mpiStatus_; }
151 {
return data_.size(); }
158 assert(i < data_.size());
167 assert(i < data_.size());
172 void setMpiDataType_()
176 if constexpr (std::is_same_v<DataType, char>) {
177 mpiDataType_ = MPI_CHAR;
179 else if constexpr (std::is_same_v<DataType, unsigned char>) {
180 mpiDataType_ = MPI_UNSIGNED_CHAR;
182 else if constexpr (std::is_same_v<DataType, short>) {
183 mpiDataType_ = MPI_SHORT;
185 else if constexpr (std::is_same_v<DataType, unsigned short>) {
186 mpiDataType_ = MPI_UNSIGNED_SHORT;
188 else if constexpr (std::is_same_v<DataType, int>) {
189 mpiDataType_ = MPI_INT;
191 else if constexpr (std::is_same_v<DataType, unsigned>) {
192 mpiDataType_ = MPI_UNSIGNED;
194 else if constexpr (std::is_same_v<DataType, long>) {
195 mpiDataType_ = MPI_LONG;
197 else if constexpr (std::is_same_v<DataType, unsigned long>) {
198 mpiDataType_ = MPI_UNSIGNED_LONG;
200 else if constexpr (std::is_same_v<DataType, long long>) {
201 mpiDataType_ = MPI_LONG_LONG;
203 else if constexpr (std::is_same_v<DataType, unsigned long long>) {
204 mpiDataType_ = MPI_UNSIGNED_LONG_LONG;
206 else if constexpr (std::is_same_v<DataType, float>) {
207 mpiDataType_ = MPI_FLOAT;
209 else if constexpr (std::is_same_v<DataType, double>) {
210 mpiDataType_ = MPI_DOUBLE;
212 else if constexpr (std::is_same_v<DataType, long double>) {
213 mpiDataType_ = MPI_LONG_DOUBLE;
216 mpiDataType_ = MPI_BYTE;
221 void updateMpiDataSize_()
224 mpiDataSize_ = data_.size();
225 if (mpiDataType_ == MPI_BYTE) {
226 mpiDataSize_ *=
sizeof(DataType);
231 std::vector<DataType> data_;
234 std::size_t mpiDataSize_;
235 MPI_Datatype mpiDataType_;
236 MPI_Request mpiRequest_;
237 MPI_Status mpiStatus_;
void send(unsigned peerRank)
Send the buffer asyncronously to a peer process.
Definition mpibuffer.hh:74