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