From 3d6ca051c141aab9585a18bf4e3b8cb28857b7d0 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Wed, 10 Oct 2018 19:20:55 +0200 Subject: [PATCH] Add preliminary generic messaging Begin some tests with int and CellType. Must provide a mechanism to convert/view none POD Arrays as simple types --- src/utils/Messenger.cpp | 41 +++++++++++++++++++++++++++-------------- src/utils/Messenger.hpp | 13 +++++++++---- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp index ee6cfb5de..fbc8a4ead 100644 --- a/src/utils/Messenger.cpp +++ b/src/utils/Messenger.cpp @@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const return array; } - +template <typename DataType> void Messenger:: -_exchange(const std::vector<Array<const int>>& sent_array_list, - std::vector<Array<int>>& recv_array_list) const +_exchange(const std::vector<Array<DataType>>& sent_array_list, + std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const { #ifdef PASTIS_HAS_MPI 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) { - 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) { 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); } } 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) { 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); } } @@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list, #endif // PASTIS_HAS_MPI } -void Messenger:: -_exchange(const std::vector<Array<int>>& sent_array_list, - std::vector<Array<int>>& recv_array_list) const -{ - std::cerr << "NIY\n"; - std::exit(1); -} +template +void Messenger::_exchange(const std::vector<Array<int>>& sent_array_list, + std::vector<Array<int>>& recv_array_list) const; +template +void Messenger::_exchange(const std::vector<Array<const int>>& sent_array_list, + 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; diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp index 796b08894..f12b54e02 100644 --- a/src/utils/Messenger.hpp +++ b/src/utils/Messenger.hpp @@ -6,6 +6,9 @@ #include <Array.hpp> +#warning REMOVE +enum class CellType : unsigned short; + class Messenger { private: @@ -21,10 +24,10 @@ class Messenger Array<int> _broadcast(Array<int>& array, int root_rank) 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, - std::vector<Array<int>>& recv_array_list) const; - void _exchange(const std::vector<Array<int>>& sent_array_list, - std::vector<Array<int>>& recv_array_list) const; + template <typename DataType> + void _exchange(const std::vector<Array<DataType>>& sent_array_list, + std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const; + public: static void create(int& argc, char* argv[]); static void destroy(); @@ -112,6 +115,8 @@ class Messenger if constexpr(std::is_same<RecvDataType, int>()) { _exchange(sent_array_list, recv_array_list); + } else if constexpr(std::is_same<RecvDataType, CellType>()) { + _exchange(sent_array_list, recv_array_list); } else { static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data"); } -- GitLab