Skip to content
Snippets Groups Projects
Commit 3d6ca051 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Add preliminary generic messaging

Begin some tests with int and CellType. Must provide a mechanism to convert/view
none POD Arrays as simple types
parent d1ef68c9
No related branches found
No related tags found
1 merge request!11Feature/mpi
...@@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const ...@@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const
return array; return array;
} }
template <typename DataType>
void Messenger:: void Messenger::
_exchange(const std::vector<Array<const int>>& sent_array_list, _exchange(const std::vector<Array<DataType>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const
{ {
#ifdef PASTIS_HAS_MPI #ifdef PASTIS_HAS_MPI
std::vector<MPI_Request> request_list; std::vector<MPI_Request> request_list;
MPI_Datatype type = [&] () -> MPI_Datatype {
if constexpr (std::is_same_v<int,std::remove_const_t<DataType>>) {
return MPI_INT;
} else if constexpr (std::is_same_v<CellType,std::remove_const_t<DataType>>) {
return MPI_SHORT;
}
} ();
for (size_t i_send=0; i_send<sent_array_list.size(); ++i_send) { for (size_t i_send=0; i_send<sent_array_list.size(); ++i_send) {
const Array<const int> sent_array = sent_array_list[i_send]; const Array<DataType> sent_array = sent_array_list[i_send];
if (sent_array.size()>0) { if (sent_array.size()>0) {
MPI_Request request; MPI_Request request;
MPI_Isend(&(sent_array[0]), sent_array.size(), MPI_INT, i_send, 0, MPI_COMM_WORLD, &request); MPI_Isend(&(sent_array[0]), sent_array.size(), type, i_send, 0, MPI_COMM_WORLD, &request);
request_list.push_back(request); request_list.push_back(request);
} }
} }
for (size_t i_recv=0; i_recv<recv_array_list.size(); ++i_recv) { for (size_t i_recv=0; i_recv<recv_array_list.size(); ++i_recv) {
Array<int> recv_array = recv_array_list[i_recv]; Array<std::remove_const_t<DataType>> recv_array = recv_array_list[i_recv];
if (recv_array.size()>0) { if (recv_array.size()>0) {
MPI_Request request; MPI_Request request;
MPI_Irecv(&(recv_array[0]), recv_array.size(), MPI_INT, i_recv, 0, MPI_COMM_WORLD, &request); MPI_Irecv(&(recv_array[0]), recv_array.size(), type, i_recv, 0, MPI_COMM_WORLD, &request);
request_list.push_back(request); request_list.push_back(request);
} }
} }
...@@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list, ...@@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list,
#endif // PASTIS_HAS_MPI #endif // PASTIS_HAS_MPI
} }
void Messenger:: template
_exchange(const std::vector<Array<int>>& sent_array_list, void Messenger::_exchange(const std::vector<Array<int>>& sent_array_list,
std::vector<Array<int>>& recv_array_list) const std::vector<Array<int>>& recv_array_list) const;
{ template
std::cerr << "NIY\n"; void Messenger::_exchange(const std::vector<Array<const int>>& sent_array_list,
std::exit(1); std::vector<Array<int>>& recv_array_list) const;
}
template
void Messenger::_exchange(const std::vector<Array<CellType>>& sent_array_list,
std::vector<Array<CellType>>& recv_array_list) const;
template
void Messenger::_exchange(const std::vector<Array<const CellType>>& sent_array_list,
std::vector<Array<CellType>>& recv_array_list) const;
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
#include <Array.hpp> #include <Array.hpp>
#warning REMOVE
enum class CellType : unsigned short;
class Messenger class Messenger
{ {
private: private:
...@@ -21,10 +24,10 @@ class Messenger ...@@ -21,10 +24,10 @@ class Messenger
Array<int> _broadcast(Array<int>& array, int root_rank) const; Array<int> _broadcast(Array<int>& array, int root_rank) const;
Array<int> _allToAll(const Array<int>& sent_array, Array<int>& recv_array) const; Array<int> _allToAll(const Array<int>& sent_array, Array<int>& recv_array) const;
void _exchange(const std::vector<Array<const int>>& sent_array_list, template <typename DataType>
std::vector<Array<int>>& recv_array_list) const; void _exchange(const std::vector<Array<DataType>>& sent_array_list,
void _exchange(const std::vector<Array<int>>& sent_array_list, std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const;
std::vector<Array<int>>& recv_array_list) const;
public: public:
static void create(int& argc, char* argv[]); static void create(int& argc, char* argv[]);
static void destroy(); static void destroy();
...@@ -112,6 +115,8 @@ class Messenger ...@@ -112,6 +115,8 @@ class Messenger
if constexpr(std::is_same<RecvDataType, int>()) { if constexpr(std::is_same<RecvDataType, int>()) {
_exchange(sent_array_list, recv_array_list); _exchange(sent_array_list, recv_array_list);
} else if constexpr(std::is_same<RecvDataType, CellType>()) {
_exchange(sent_array_list, recv_array_list);
} else { } else {
static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data"); static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data");
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment