]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Reduce number of versions of internal::all_reduce 5195/head
authorDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Tue, 3 Oct 2017 22:53:21 +0000 (00:53 +0200)
committerDaniel Arndt <daniel.arndt@iwr.uni-heidelberg.de>
Wed, 4 Oct 2017 21:36:17 +0000 (23:36 +0200)
include/deal.II/base/mpi.h
include/deal.II/base/mpi.templates.h
source/base/mpi.inst.in

index 1c42e24a16c7625ae09b436c299608d76b6529bc..8afff6e2c5ae09d5cb0359b8a8b3be521bd88a8a 100644 (file)
@@ -17,6 +17,7 @@
 #define dealii_mpi_h
 
 #include <deal.II/base/config.h>
+#include <deal.II/base/array_view.h>
 
 #include <vector>
 
@@ -163,6 +164,11 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               T (&sums)[N]);
 
+    template <typename T>
+    void sum (const ArrayView<const T> &values,
+              const MPI_Comm           &mpi_communicator,
+              const ArrayView<T>       &sums);
+
     /**
      * Like the previous function, but take the sums over the elements of a
      * std::vector. In other words, the i-th element of the results array is
@@ -481,11 +487,10 @@ namespace Utilities
     namespace internal
     {
       template <typename T>
-      void all_reduce (const MPI_Op      &mpi_op,
-                       const T *const    values,
-                       const MPI_Comm    &mpi_communicator,
-                       T                 *output,
-                       const std::size_t  size);
+      void all_reduce (const MPI_Op             &mpi_op,
+                       const ArrayView<const T> &values,
+                       const MPI_Comm           &mpi_communicator,
+                       const ArrayView<T>       &output);
     }
 
     // Since these depend on N they must live in the header file
@@ -494,7 +499,8 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               T (&sums)[N])
     {
-      internal::all_reduce(MPI_SUM, values, mpi_communicator, sums, N);
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(values, N),
+                           mpi_communicator, ArrayView<T>(sums, N));
     }
 
     template <typename T, unsigned int N>
@@ -502,7 +508,8 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               T (&maxima)[N])
     {
-      internal::all_reduce(MPI_MAX, values, mpi_communicator, maxima, N);
+      internal::all_reduce(MPI_MAX, ArrayView<const T>(values, N),
+                           mpi_communicator, ArrayView<T>(maxima, N));
     }
 
     template <typename T, unsigned int N>
@@ -510,7 +517,8 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               T (&minima)[N])
     {
-      internal::all_reduce(MPI_MIN, values, mpi_communicator, minima, N);
+      internal::all_reduce(MPI_MIN, ArrayView<const T>(values, N),
+                           mpi_communicator, ArrayView<T>(minima, N));
     }
 #endif
   } // end of namespace MPI
index f316f2de851492d2f0136c58c32e68eb6deb8033..f1ca3940201f7504222776d6001fe01a6c3a0d7a 100644 (file)
@@ -95,14 +95,13 @@ namespace Utilities
 #endif
 
 
-
       template <typename T>
-      void all_reduce (const MPI_Op      &mpi_op,
-                       const T *const    values,
-                       const MPI_Comm    &mpi_communicator,
-                       T                 *output,
-                       const std::size_t  size)
+      void all_reduce (const MPI_Op             &mpi_op,
+                       const ArrayView<const T> &values,
+                       const MPI_Comm           &mpi_communicator,
+                       const ArrayView<T>       &output)
       {
+        AssertDimension(values.size(), output.size());
 #ifdef DEAL_II_WITH_MPI
         if (job_supports_mpi())
           {
@@ -114,12 +113,12 @@ namespace Utilities
                               // implementations of MPI-2. It is not needed as
                               // of MPI-3 and we should remove it at some
                               // point in the future.
-                              const_cast<void *>(static_cast<const void *>(values))
+                              const_cast<void *>(static_cast<const void *>(values.begin()))
                               :
                               MPI_IN_PLACE,
-                              static_cast<void *>(output),
-                              static_cast<int>(size),
-                              internal::mpi_type_id(values),
+                              static_cast<void *>(output.begin()),
+                              static_cast<int>(values.size()),
+                              internal::mpi_type_id(values.begin()),
                               mpi_op,
                               mpi_communicator);
             AssertThrowMPI(ierr);
@@ -129,24 +128,23 @@ namespace Utilities
           {
             (void)mpi_op;
             (void)mpi_communicator;
-            for (std::size_t i=0; i<size; ++i)
-              output[i] = values[i];
+            if (values != output)
+              std::copy(values.begin(), values.end(), output.begin());
           }
       }
 
 
 
       template <typename T>
-      void all_reduce (const MPI_Op                   &mpi_op,
-                       const std::complex<T> *const    values,
-                       const MPI_Comm                 &mpi_communicator,
-                       std::complex<T>                *output,
-                       const std::size_t               size)
+      void all_reduce (const MPI_Op                           &mpi_op,
+                       const ArrayView<const std::complex<T>> &values,
+                       const MPI_Comm                         &mpi_communicator,
+                       const ArrayView<std::complex<T>>       &output)
       {
+        AssertDimension(values.size(), output.size());
 #ifdef DEAL_II_WITH_MPI
         if (job_supports_mpi())
           {
-            T dummy_selector;
             const int ierr = MPI_Allreduce
                              (values != output
                               ?
@@ -155,12 +153,12 @@ namespace Utilities
                               // implementations of MPI-2. It is not needed as
                               // of MPI-3 and we should remove it at some
                               // point in the future.
-                              const_cast<void *>(static_cast<const void *>(values))
+                              const_cast<void *>(static_cast<const void *>(values.begin()))
                               :
                               MPI_IN_PLACE,
-                              static_cast<void *>(output),
-                              static_cast<int>(size*2),
-                              internal::mpi_type_id(&dummy_selector),
+                              static_cast<void *>(output.begin()),
+                              static_cast<int>(values.size()*2),
+                              internal::mpi_type_id(static_cast<T *>(nullptr)),
                               mpi_op,
                               mpi_communicator);
             AssertThrowMPI(ierr);
@@ -170,79 +168,10 @@ namespace Utilities
           {
             (void)mpi_op;
             (void)mpi_communicator;
-            for (std::size_t i=0; i<size; ++i)
-              output[i] = values[i];
+            if (values != output)
+              std::copy(values.begin(), values.end(), output.begin());
           }
       }
-
-
-
-      template <typename T>
-      T all_reduce (const MPI_Op &mpi_op,
-                    const T &t,
-                    const MPI_Comm &mpi_communicator)
-      {
-        T output;
-        all_reduce(mpi_op, &t, mpi_communicator, &output, 1);
-        return output;
-      }
-
-
-
-      template <typename T>
-      void all_reduce (const MPI_Op &mpi_op,
-                       const std::vector<T> &values,
-                       const MPI_Comm       &mpi_communicator,
-                       std::vector<T>       &output)
-      {
-        Assert(values.size() == output.size(),
-               ExcDimensionMismatch(values.size(), output.size()));
-        all_reduce(mpi_op, &values[0], mpi_communicator, &output[0], values.size());
-      }
-
-
-
-      template <typename T>
-      void all_reduce (const MPI_Op    &mpi_op,
-                       const Vector<T> &values,
-                       const MPI_Comm  &mpi_communicator,
-                       Vector<T>  &output)
-      {
-        Assert(values.size() == output.size(),
-               ExcDimensionMismatch(values.size(), output.size()));
-        all_reduce(mpi_op, values.begin(), mpi_communicator, output.begin(), values.size());
-      }
-
-
-
-      template <typename T>
-      void all_reduce (const MPI_Op    &mpi_op,
-                       const FullMatrix<T> &values,
-                       const MPI_Comm  &mpi_communicator,
-                       FullMatrix<T>  &output)
-      {
-        Assert(values.m() == output.m(),
-               ExcDimensionMismatch(values.m(), output.m()));
-        Assert(values.n() == output.n(),
-               ExcDimensionMismatch(values.n(), output.n()));
-        all_reduce(mpi_op, &values[0][0], mpi_communicator, &output[0][0], values.m() * values.n());
-      }
-
-
-
-      template <typename T>
-      void all_reduce (const MPI_Op    &mpi_op,
-                       const LAPACKFullMatrix<T> &values,
-                       const MPI_Comm  &mpi_communicator,
-                       LAPACKFullMatrix<T>  &output)
-      {
-        Assert(values.m() == output.m(),
-               ExcDimensionMismatch(values.m(), output.m()));
-        Assert(values.n() == output.n(),
-               ExcDimensionMismatch(values.n(), output.n()));
-        all_reduce(mpi_op, &values(0,0), mpi_communicator, &output(0,0), values.m() * values.n());
-      }
-
     }
 
 
@@ -251,7 +180,10 @@ namespace Utilities
     T sum (const T &t,
            const MPI_Comm &mpi_communicator)
     {
-      return internal::all_reduce(MPI_SUM, t, mpi_communicator);
+      T return_value;
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(&t,1),
+                           mpi_communicator, ArrayView<T>(&return_value,1));
+      return return_value;
     }
 
 
@@ -260,6 +192,17 @@ namespace Utilities
     void sum (const std::vector<T> &values,
               const MPI_Comm       &mpi_communicator,
               std::vector<T>       &sums)
+    {
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(values),
+                           mpi_communicator, ArrayView<T>(sums));
+    }
+
+
+
+    template <typename T>
+    void sum (const ArrayView<const T> &values,
+              const MPI_Comm           &mpi_communicator,
+              const ArrayView<T>       &sums)
     {
       internal::all_reduce(MPI_SUM, values, mpi_communicator, sums);
     }
@@ -271,7 +214,9 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               Vector<T> &sums)
     {
-      internal::all_reduce(MPI_SUM, values, mpi_communicator, sums);
+      const auto &size = values.size();
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(values.begin(), size),
+                           mpi_communicator, ArrayView<T>(sums.begin(), size));
     }
 
 
@@ -281,7 +226,10 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               FullMatrix<T> &sums)
     {
-      internal::all_reduce(MPI_SUM, values, mpi_communicator, sums);
+      const auto size_values = values.n()*values.m();
+      const auto size_sums = sums.n()*sums.m();
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(&values[0][0], size_values),
+                           mpi_communicator, ArrayView<T>(&sums[0][0], size_sums));
     }
 
 
@@ -291,7 +239,10 @@ namespace Utilities
               const MPI_Comm &mpi_communicator,
               LAPACKFullMatrix<T> &sums)
     {
-      internal::all_reduce(MPI_SUM, values, mpi_communicator, sums);
+      const auto size_values = values.n()*values.m();
+      const auto size_sums = sums.n()*sums.m();
+      internal::all_reduce(MPI_SUM, ArrayView<const T>(&values(0,0), size_values),
+                           mpi_communicator, ArrayView<T>(&sums(0,0), size_sums));
     }
 
 
@@ -346,7 +297,10 @@ namespace Utilities
     T max (const T &t,
            const MPI_Comm &mpi_communicator)
     {
-      return internal::all_reduce(MPI_MAX, t, mpi_communicator);
+      T return_value;
+      internal::all_reduce(MPI_MAX, ArrayView<const T>(&t,1),
+                           mpi_communicator, ArrayView<T> (&return_value,1));
+      return return_value;
     }
 
 
@@ -356,7 +310,8 @@ namespace Utilities
               const MPI_Comm       &mpi_communicator,
               std::vector<T>       &maxima)
     {
-      internal::all_reduce(MPI_MAX, values, mpi_communicator, maxima);
+      internal::all_reduce(MPI_MAX, ArrayView<const T>(values),
+                           mpi_communicator, ArrayView<T> (maxima));
     }
 
 
@@ -365,7 +320,10 @@ namespace Utilities
     T min (const T &t,
            const MPI_Comm &mpi_communicator)
     {
-      return internal::all_reduce(MPI_MIN, t, mpi_communicator);
+      T return_value;
+      internal::all_reduce(MPI_MIN, ArrayView<const T>(&t,1),
+                           mpi_communicator, ArrayView<T>(&return_value,1));
+      return return_value;
     }
 
 
@@ -375,7 +333,8 @@ namespace Utilities
               const MPI_Comm       &mpi_communicator,
               std::vector<T>       &minima)
     {
-      internal::all_reduce(MPI_MIN, values, mpi_communicator, minima);
+      internal::all_reduce(MPI_MIN, ArrayView<const T>(values),
+                           mpi_communicator, ArrayView<T> (minima));
     }
   } // end of namespace MPI
 } // end of namespace Utilities
index 504a385c589f0ad353bce9041ea78ef49beb12d5..bbbc0b88076c383f587c1cafca72415a1ba14ab3 100644 (file)
@@ -27,6 +27,9 @@ for (S : MPI_SCALARS)
     template
     void sum<S> (const FullMatrix<S> &, const MPI_Comm &, FullMatrix<S> &);
 
+    template
+    void sum<S> (const ArrayView<const S> &, const MPI_Comm &, const ArrayView<S> &);
+
     template
     S sum<S> (const S &, const MPI_Comm &);
 
@@ -61,10 +64,9 @@ for (S : MPI_SCALARS)
     // seem to inline it with the '-march=native' flag.
     template
     void Utilities::MPI::internal::all_reduce<S> (const MPI_Op    &,
-            const S *const,
+            const ArrayView<const S> &,
             const MPI_Comm  &,
-            S               *,
-            const std::size_t);
+            const ArrayView<S>    &);
 }
 
 
@@ -81,8 +83,10 @@ for (S : COMPLEX_SCALARS)
 
     template
     void sum<S> (const std::vector<S> &, const MPI_Comm &, std::vector<S> &);
-}
 
+    template
+    void sum<S> (const ArrayView<const S> &, const MPI_Comm &, const ArrayView<S> &);
+}
 
 for (S : REAL_SCALARS; rank: RANKS; dim : SPACE_DIMENSIONS)
 {

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.