From e09d331937767ac6405ceda7d7135d22076e9d0d Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 1 Oct 2018 15:58:41 +0200 Subject: [PATCH] Add barrier and simple broadcast for integer arrays --- src/utils/Messenger.cpp | 20 ++++++++++++++++++++ src/utils/Messenger.hpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp index 20fdc4842..d631fcf3c 100644 --- a/src/utils/Messenger.cpp +++ b/src/utils/Messenger.cpp @@ -50,3 +50,23 @@ Messenger:: MPI_Finalize(); #endif // PASTIS_HAS_MPI } + + +void Messenger::barrier() const +{ +#ifdef PASTIS_HAS_MPI + MPI_Barrier(MPI_COMM_WORLD); +#endif // PASTIS_HAS_MPI +} + +Array<int> Messenger:: +_broadcast(Array<int>& array, int root_rank) const +{ + int size = array.size(); + MPI_Bcast(&size, 1, MPI_INT, root_rank, MPI_COMM_WORLD); + if (commRank() != root_rank) { + array = Array<int>(size); + } + MPI_Bcast(&(array[0]), array.size(), MPI_INT, root_rank, MPI_COMM_WORLD); + return array; +} diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp index 94e551c9a..a0bd59328 100644 --- a/src/utils/Messenger.hpp +++ b/src/utils/Messenger.hpp @@ -4,6 +4,8 @@ #include <PastisMacros.hpp> #include <PastisAssert.hpp> +#include <Array.hpp> + class Messenger { private: @@ -12,6 +14,9 @@ class Messenger int m_rank{0}; int m_size{1}; + + Array<int> _broadcast(Array<int>& array, int root_rank) const; + public: static void create(int& argc, char* argv[]); static void destroy(); @@ -35,6 +40,20 @@ class Messenger return m_size; } + void barrier() const; + + template <typename DataType> + PASTIS_INLINE + Array<DataType> broadcast(const Array<DataType>& array, int root_rank) const + { + if constexpr(std::is_same<DataType, int>()) { + Array<int> int_array = array; + return _broadcast(int_array, root_rank); + } else { + static_assert(std::is_same<DataType, int>(), "unexpected type of data"); + } + } + Messenger(const Messenger&) = delete; ~Messenger(); }; @@ -59,5 +78,17 @@ const int& commSize() return messenger().size(); } +PASTIS_INLINE +void barrier() +{ + return messenger().barrier(); +} + +template <typename DataType> +PASTIS_INLINE +Array<DataType> broadcast(const Array<DataType>& array, int root_rank) +{ + return messenger().broadcast(array, root_rank); +} #endif // MESSENGER_HPP -- GitLab