fpmas 1.6
communication.h
Go to the documentation of this file.
1#ifndef FPMAS_COMMUNICATION_API_H
2#define FPMAS_COMMUNICATION_API_H
3
9
10namespace fpmas { namespace api { namespace communication {
11
12
16 class DataPack {
17 public:
23 std::size_t size;
27 std::size_t count;
31 std::size_t data_size;
32
36 char* buffer;
37
41 DataPack(std::size_t count, std::size_t data_size)
43 buffer = (char*) std::malloc(size);
44 }
45
49 DataPack() : DataPack(0, 0) {
50 }
51
60 DataPack(const DataPack& other) :
61 size(other.size), count(other.count), data_size(other.data_size),
62 buffer((char*) std::malloc(size)) {
63 std::memcpy(buffer, other.buffer, size);
64 }
65
74 : size(other.size), count(other.count), data_size(other.data_size) {
75 buffer = other.buffer;
76 other.buffer = (char*) std::malloc(0);
77 other.size = 0;
78 other.count = 0;
79 }
80
89 DataPack& operator=(const DataPack& other) {
90 size = other.size;
91 count = other.count;
92 data_size = other.data_size;
93 buffer = (char*) std::realloc(buffer, size);
94 std::memcpy(buffer, other.buffer, size);
95 return *this;
96 }
97
107 std::free(buffer);
108 size = other.size;
109 count = other.count;
110 data_size = other.data_size;
111 buffer = other.buffer;
112 other.buffer = (char*) std::malloc(0);
113 other.size = 0;
114 other.count = 0;
115 return *this;
116 }
117
130 void resize(std::size_t count) {
131 this->count = count;
132 this->size = count * data_size;
133 buffer = (char*) std::realloc(buffer, this->size);
134 }
135
139 void free() {
140 std::free(buffer);
141 // A buffer of size 0 is assigned to prevent issues when
142 // std::free() is called again in the DataPack destructor.
143 buffer = (char*) std::malloc(0);
144 size = 0;
145 count = 0;
146 }
147
152 std::free(buffer);
153 }
154 };
155
162 struct Request {
166 MPI_Request __mpi_request;
170 DataPack* __data;
171
172 Request() : __mpi_request(), __data(nullptr) {}
173 Request(const Request&) = delete;
179 Request(Request&& request) {
180 this->__mpi_request = request.__mpi_request;
181 this->__data = request.__data;
182 request.__data = nullptr;
183 }
184
185 Request& operator=(const Request&) = delete;
192 this->__mpi_request = request.__mpi_request;
193 this->__data = request.__data;
194 request.__data = nullptr;
195 return *this;
196 }
197
204 void free() {
205 if(__data!=nullptr) {
206 delete __data;
207 __data = nullptr;
208 }
209 }
210 };
211
215 struct Status {
224 int size;
236 int tag;
237
238 Status() : size(0), item_count(0), source(0), tag(0) {}
239 };
240
252 public:
259 static MPI_Datatype IGNORE_TYPE;
260
265 virtual int getRank() const = 0;
271 virtual int getSize() const = 0;
272
292 virtual void send(
293 const void* data, int count, MPI_Datatype datatype,
294 int destination, int tag) = 0;
295
304 virtual void send(
305 const DataPack& data, MPI_Datatype datatype,
306 int destination, int tag) = 0;
307
317 virtual void send(int destination, int tag) = 0;
318
338 virtual void Isend(
339 const void* data, int count, MPI_Datatype datatype,
340 int destination, int tag, Request& request) = 0;
341
351 virtual void Isend(
352 const DataPack& data, MPI_Datatype datatype,
353 int destination, int tag, Request& request) = 0;
354
366 virtual void Isend(
367 int destination, int tag, Request& request) = 0;
368
392 virtual void Issend(
393 const void* data, int count, MPI_Datatype datatype,
394 int destination, int tag, Request& request) = 0;
395
405 virtual void Issend(
406 const DataPack& data, MPI_Datatype datatype,
407 int destination, int tag, Request& request) = 0;
408
425 virtual void Issend(int destination, int tag, Request& request) = 0;
426
441 virtual void probe(MPI_Datatype type, int source, int tag, Status& status) = 0;
442
458 virtual bool Iprobe(MPI_Datatype type, int source, int tag, Status& status) = 0;
459
460
470 virtual void recv(int source, int tag, Status& status = Status::IGNORE) = 0;
471
472
487 virtual void recv(
488 void* buffer, int count, MPI_Datatype datatype,
489 int source, int tag, Status& status) = 0;
490
500 virtual void recv(
501 DataPack& data, MPI_Datatype datatype,
502 int source, int tag, Status& status) = 0;
503
516 virtual bool test(Request& request) = 0;
517
526 virtual void wait(Request& request) = 0;
527
536 virtual void waitAll(std::vector<Request>& requests) = 0;
537
552 // TODO: should std::vector be used instead of map? pb: what if we
553 // want to send "no data" to process?
554 virtual std::unordered_map<int, DataPack> allToAll(
555 std::unordered_map<int, DataPack> export_map, MPI_Datatype datatype
556 ) = 0;
557
575 virtual std::vector<DataPack>
576 gather(DataPack data, MPI_Datatype datatype, int root) = 0;
577
592 virtual std::vector<DataPack>
593 allGather(DataPack data, MPI_Datatype datatype) = 0;
594
609 virtual DataPack bcast(DataPack data, MPI_Datatype datatype, int root) = 0;
610
618 virtual void barrier() = 0;
619
620 virtual ~MpiCommunicator() {};
621 };
622
636 template<typename T>
637 class TypedMpi {
638 public:
649 // TODO: Remove this in 2.0
650 virtual std::unordered_map<int, std::vector<T>>
651 migrate(std::unordered_map<int, std::vector<T>> export_map) = 0;
652
661 virtual std::unordered_map<int, T>
662 allToAll(std::unordered_map<int, T> export_map) = 0;
663
674 virtual std::vector<T>
675 gather(const T& data, int root) = 0;
676
685 virtual std::vector<T>
686 allGather(const T& data) = 0;
687
697 virtual T bcast(const T& data, int root) = 0;
698
708 virtual void send(const T& data, int destination, int tag) = 0;
709
720 virtual void Isend(const T& data, int destination, int tag, Request& req) = 0;
721
733 virtual void Issend(const T& data, int destination, int tag, Request& req) = 0;
734
748 virtual void probe(int source, int tag, Status& status) = 0;
749
764 virtual bool Iprobe(int source, int tag, Status& status) = 0;
765
773 virtual T recv(int source, int tag, Status& status = Status::IGNORE) = 0;
774
775 virtual ~TypedMpi() {};
776 };
777
781 bool operator==(const DataPack& d1, const DataPack& d2);
782}
783}}
784#endif
Definition: communication.h:16
std::size_t size
Definition: communication.h:23
void free()
Definition: communication.h:139
DataPack & operator=(DataPack &&other)
Definition: communication.h:106
DataPack(DataPack &&other)
Definition: communication.h:73
DataPack & operator=(const DataPack &other)
Definition: communication.h:89
DataPack(std::size_t count, std::size_t data_size)
Definition: communication.h:41
~DataPack()
Definition: communication.h:151
DataPack()
Definition: communication.h:49
std::size_t count
Definition: communication.h:27
char * buffer
Definition: communication.h:36
void resize(std::size_t count)
Definition: communication.h:130
std::size_t data_size
Definition: communication.h:31
DataPack(const DataPack &other)
Definition: communication.h:60
Definition: communication.h:251
virtual void send(const DataPack &data, MPI_Datatype datatype, int destination, int tag)=0
virtual bool test(Request &request)=0
virtual std::unordered_map< int, DataPack > allToAll(std::unordered_map< int, DataPack > export_map, MPI_Datatype datatype)=0
virtual void waitAll(std::vector< Request > &requests)=0
virtual void Isend(const void *data, int count, MPI_Datatype datatype, int destination, int tag, Request &request)=0
virtual void send(int destination, int tag)=0
virtual void wait(Request &request)=0
virtual void Issend(const void *data, int count, MPI_Datatype datatype, int destination, int tag, Request &request)=0
static MPI_Datatype IGNORE_TYPE
Definition: communication.h:259
virtual void probe(MPI_Datatype type, int source, int tag, Status &status)=0
virtual void Issend(int destination, int tag, Request &request)=0
virtual void recv(void *buffer, int count, MPI_Datatype datatype, int source, int tag, Status &status)=0
virtual void Issend(const DataPack &data, MPI_Datatype datatype, int destination, int tag, Request &request)=0
virtual void recv(int source, int tag, Status &status=Status::IGNORE)=0
virtual bool Iprobe(MPI_Datatype type, int source, int tag, Status &status)=0
virtual std::vector< DataPack > gather(DataPack data, MPI_Datatype datatype, int root)=0
virtual void Isend(const DataPack &data, MPI_Datatype datatype, int destination, int tag, Request &request)=0
virtual void Isend(int destination, int tag, Request &request)=0
virtual std::vector< DataPack > allGather(DataPack data, MPI_Datatype datatype)=0
virtual void recv(DataPack &data, MPI_Datatype datatype, int source, int tag, Status &status)=0
virtual DataPack bcast(DataPack data, MPI_Datatype datatype, int root)=0
virtual void send(const void *data, int count, MPI_Datatype datatype, int destination, int tag)=0
Definition: communication.h:637
virtual void Issend(const T &data, int destination, int tag, Request &req)=0
virtual bool Iprobe(int source, int tag, Status &status)=0
virtual std::unordered_map< int, std::vector< T > > migrate(std::unordered_map< int, std::vector< T > > export_map)=0
virtual T recv(int source, int tag, Status &status=Status::IGNORE)=0
virtual std::vector< T > gather(const T &data, int root)=0
virtual T bcast(const T &data, int root)=0
virtual std::vector< T > allGather(const T &data)=0
virtual void probe(int source, int tag, Status &status)=0
virtual void Isend(const T &data, int destination, int tag, Request &req)=0
virtual std::unordered_map< int, T > allToAll(std::unordered_map< int, T > export_map)=0
virtual void send(const T &data, int destination, int tag)=0
bool operator==(const DataPack &d1, const DataPack &d2)
Definition: communication.cpp:7
Definition: fpmas.cpp:3
Definition: communication.h:162
void free()
Definition: communication.h:204
Request(Request &&request)
Definition: communication.h:179
Request & operator=(Request &&request)
Definition: communication.h:191
Definition: communication.h:215
int tag
Definition: communication.h:236
static Status IGNORE
Definition: communication.h:220
int size
Definition: communication.h:224
int item_count
Definition: communication.h:228
int source
Definition: communication.h:232