]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Move MemorySpaceData to its own file to avoid circular dependency
authorBruno Turcksin <bruno.turcksin@gmail.com>
Tue, 29 Sep 2020 01:32:49 +0000 (01:32 +0000)
committerBruno Turcksin <bruno.turcksin@gmail.com>
Tue, 29 Sep 2020 01:41:49 +0000 (01:41 +0000)
include/deal.II/base/memory_space.h
include/deal.II/base/memory_space_data.h [new file with mode: 0644]
include/deal.II/lac/la_parallel_vector.h
include/deal.II/lac/vector_operations_internal.h

index 56c60844984cd30fe39ebb2b6e5bc86e5d598236..51c40f56d14807a0a7e03cb84c397c0f113c5780 100644 (file)
 
 #include <deal.II/base/config.h>
 
-#include <deal.II/base/cuda.h>
-#include <deal.II/base/exceptions.h>
-
-#include <functional>
-#include <memory>
-
 DEAL_II_NAMESPACE_OPEN
 
 /**
@@ -45,172 +39,6 @@ namespace MemorySpace
   struct CUDA
   {};
 
-
-
-  /**
-   * Data structure
-   */
-  template <typename Number, typename MemorySpace>
-  struct MemorySpaceData
-  {
-    MemorySpaceData()
-    {
-      static_assert(std::is_same<MemorySpace, Host>::value ||
-                      std::is_same<MemorySpace, CUDA>::value,
-                    "MemorySpace should be Host or CUDA");
-    }
-
-    /**
-     * Copy the active data (values for Host and values_dev for CUDA) to @p begin.
-     * If the data is on the device it is moved to the host.
-     */
-    virtual void
-    copy_to(Number *begin, std::size_t n_elements)
-    {
-      (void)begin;
-      (void)n_elements;
-    }
-
-    /**
-     * Copy the data in @p begin to the active data of the structure (values for
-     * Host and values_dev for CUDA). The pointer @p begin must be on the host.
-     */
-    virtual void
-    copy_from(Number *begin, std::size_t n_elements)
-    {
-      (void)begin;
-      (void)n_elements;
-    }
-
-    /**
-     * Pointer to data on the host.
-     */
-    std::unique_ptr<Number[], std::function<void(Number *)>> values;
-
-    /**
-     * Pointer to data on the device.
-     */
-    std::unique_ptr<Number[]> values_dev;
-  };
-
-
-
-  /**
-   * Swap function similar to std::swap.
-   */
-  template <typename Number, typename MemorySpace>
-  inline void
-  swap(MemorySpaceData<Number, MemorySpace> &,
-       MemorySpaceData<Number, MemorySpace> &)
-  {
-    static_assert(std::is_same<MemorySpace, Host>::value ||
-                    std::is_same<MemorySpace, CUDA>::value,
-                  "MemorySpace should be Host or CUDA");
-  }
-
-#ifndef DOXYGEN
-
-  template <typename Number>
-  struct MemorySpaceData<Number, Host>
-  {
-    MemorySpaceData()
-      : values(nullptr, &std::free)
-    {}
-
-    virtual ~MemorySpaceData() = default;
-
-    MemorySpaceData(MemorySpaceData &&) noexcept = default;
-
-    MemorySpaceData &
-    operator=(MemorySpaceData &&) noexcept = default;
-
-    virtual void
-    copy_to(Number *begin, std::size_t n_elements)
-    {
-      std::copy(values.get(), values.get() + n_elements, begin);
-    }
-
-    virtual void
-    copy_from(Number *begin, std::size_t n_elements)
-    {
-      std::copy(begin, begin + n_elements, values.get());
-    }
-
-    std::unique_ptr<Number[], std::function<void(Number *)>> values;
-
-    // This is not used but it allows to simplify the code until we start using
-    // CUDA-aware MPI.
-    std::unique_ptr<Number[]> values_dev;
-  };
-
-
-
-  template <typename Number>
-  inline void
-  swap(MemorySpaceData<Number, Host> &u, MemorySpaceData<Number, Host> &v)
-  {
-    std::swap(u.values, v.values);
-  }
-
-
-
-#  ifdef DEAL_II_COMPILER_CUDA_AWARE
-
-  template <typename Number>
-  struct MemorySpaceData<Number, CUDA>
-  {
-    MemorySpaceData()
-      : values(nullptr, &std::free)
-      , values_dev(nullptr, Utilities::CUDA::delete_device_data<Number>)
-    {}
-
-    virtual ~MemorySpaceData() = default;
-
-    MemorySpaceData(MemorySpaceData &&) noexcept = default;
-
-    MemorySpaceData &
-    operator=(MemorySpaceData &&) noexcept = default;
-
-    virtual void
-    copy_to(Number *begin, std::size_t n_elements)
-    {
-      const cudaError_t cuda_error_code =
-        cudaMemcpy(begin,
-                   values_dev.get(),
-                   n_elements * sizeof(Number),
-                   cudaMemcpyDeviceToHost);
-      AssertCuda(cuda_error_code);
-    }
-
-    virtual void
-    copy_from(Number *begin, std::size_t n_elements)
-    {
-      const cudaError_t cuda_error_code =
-        cudaMemcpy(values_dev.get(),
-                   begin,
-                   n_elements * sizeof(Number),
-                   cudaMemcpyHostToDevice);
-      AssertCuda(cuda_error_code);
-    }
-
-    std::unique_ptr<Number[], std::function<void(Number *)>> values;
-    std::unique_ptr<Number[], void (*)(Number *)>            values_dev;
-  };
-
-
-
-  template <typename Number>
-  inline void
-  swap(MemorySpaceData<Number, CUDA> &u, MemorySpaceData<Number, CUDA> &v)
-  {
-    std::swap(u.values, v.values);
-    std::swap(u.values_dev, v.values_dev);
-  }
-
-#  endif
-
-#endif
-
 } // namespace MemorySpace
 
 DEAL_II_NAMESPACE_CLOSE
diff --git a/include/deal.II/base/memory_space_data.h b/include/deal.II/base/memory_space_data.h
new file mode 100644 (file)
index 0000000..7cb37bc
--- /dev/null
@@ -0,0 +1,202 @@
+// ---------------------------------------------------------------------
+//
+// Copyright (C) 2020 by the deal.II authors
+//
+// This file is part of the deal.II library.
+//
+// The deal.II library is free software; you can use it, redistribute
+// it, and/or modify it under the terms of the GNU Lesser General
+// Public License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+// The full text of the license can be found in the file LICENSE.md at
+// the top level directory of deal.II.
+//
+// ---------------------------------------------------------------------
+
+
+#ifndef dealii_memory_space_data_h
+#define dealii_memory_space_data_h
+
+#include <deal.II/base/config.h>
+
+#include <deal.II/base/cuda.h>
+#include <deal.II/base/exceptions.h>
+
+#include <functional>
+#include <memory>
+
+DEAL_II_NAMESPACE_OPEN
+
+/**
+ */
+namespace MemorySpace
+{
+  /**
+   * Data structure
+   */
+  template <typename Number, typename MemorySpace>
+  struct MemorySpaceData
+  {
+    MemorySpaceData()
+    {
+      static_assert(std::is_same<MemorySpace, Host>::value ||
+                      std::is_same<MemorySpace, CUDA>::value,
+                    "MemorySpace should be Host or CUDA");
+    }
+
+    /**
+     * Copy the active data (values for Host and values_dev for CUDA) to @p begin.
+     * If the data is on the device it is moved to the host.
+     */
+    virtual void
+    copy_to(Number *begin, std::size_t n_elements)
+    {
+      (void)begin;
+      (void)n_elements;
+    }
+
+    /**
+     * Copy the data in @p begin to the active data of the structure (values for
+     * Host and values_dev for CUDA). The pointer @p begin must be on the host.
+     */
+    virtual void
+    copy_from(Number *begin, std::size_t n_elements)
+    {
+      (void)begin;
+      (void)n_elements;
+    }
+
+    /**
+     * Pointer to data on the host.
+     */
+    std::unique_ptr<Number[], std::function<void(Number *)>> values;
+
+    /**
+     * Pointer to data on the device.
+     */
+    std::unique_ptr<Number[]> values_dev;
+  };
+
+
+
+  /**
+   * Swap function similar to std::swap.
+   */
+  template <typename Number, typename MemorySpace>
+  inline void
+  swap(MemorySpaceData<Number, MemorySpace> &,
+       MemorySpaceData<Number, MemorySpace> &)
+  {
+    static_assert(std::is_same<MemorySpace, Host>::value ||
+                    std::is_same<MemorySpace, CUDA>::value,
+                  "MemorySpace should be Host or CUDA");
+  }
+
+#ifndef DOXYGEN
+
+  template <typename Number>
+  struct MemorySpaceData<Number, Host>
+  {
+    MemorySpaceData()
+      : values(nullptr, &std::free)
+    {}
+
+    virtual ~MemorySpaceData() = default;
+
+    MemorySpaceData(MemorySpaceData &&) noexcept = default;
+
+    MemorySpaceData &
+    operator=(MemorySpaceData &&) noexcept = default;
+
+    virtual void
+    copy_to(Number *begin, std::size_t n_elements)
+    {
+      std::copy(values.get(), values.get() + n_elements, begin);
+    }
+
+    virtual void
+    copy_from(Number *begin, std::size_t n_elements)
+    {
+      std::copy(begin, begin + n_elements, values.get());
+    }
+
+    std::unique_ptr<Number[], std::function<void(Number *)>> values;
+
+    // This is not used but it allows to simplify the code until we start using
+    // CUDA-aware MPI.
+    std::unique_ptr<Number[]> values_dev;
+  };
+
+
+
+  template <typename Number>
+  inline void
+  swap(MemorySpaceData<Number, Host> &u, MemorySpaceData<Number, Host> &v)
+  {
+    std::swap(u.values, v.values);
+  }
+
+
+
+#  ifdef DEAL_II_COMPILER_CUDA_AWARE
+
+  template <typename Number>
+  struct MemorySpaceData<Number, CUDA>
+  {
+    MemorySpaceData()
+      : values(nullptr, &std::free)
+      , values_dev(nullptr, Utilities::CUDA::delete_device_data<Number>)
+    {}
+
+    virtual ~MemorySpaceData() = default;
+
+    MemorySpaceData(MemorySpaceData &&) noexcept = default;
+
+    MemorySpaceData &
+    operator=(MemorySpaceData &&) noexcept = default;
+
+    virtual void
+    copy_to(Number *begin, std::size_t n_elements)
+    {
+      const cudaError_t cuda_error_code =
+        cudaMemcpy(begin,
+                   values_dev.get(),
+                   n_elements * sizeof(Number),
+                   cudaMemcpyDeviceToHost);
+      AssertCuda(cuda_error_code);
+    }
+
+    virtual void
+    copy_from(Number *begin, std::size_t n_elements)
+    {
+      const cudaError_t cuda_error_code =
+        cudaMemcpy(values_dev.get(),
+                   begin,
+                   n_elements * sizeof(Number),
+                   cudaMemcpyHostToDevice);
+      AssertCuda(cuda_error_code);
+    }
+
+    std::unique_ptr<Number[], std::function<void(Number *)>> values;
+    std::unique_ptr<Number[], void (*)(Number *)>            values_dev;
+  };
+
+
+
+  template <typename Number>
+  inline void
+  swap(MemorySpaceData<Number, CUDA> &u, MemorySpaceData<Number, CUDA> &v)
+  {
+    std::swap(u.values, v.values);
+    std::swap(u.values_dev, v.values_dev);
+  }
+
+#  endif
+
+#endif
+
+} // namespace MemorySpace
+
+DEAL_II_NAMESPACE_CLOSE
+
+#endif
index 1186423416f14c963895e7cc575614ab30b4969e..16e1251a2d94c0e89ca3844383d5054bf04ce736 100644 (file)
@@ -19,6 +19,7 @@
 #include <deal.II/base/config.h>
 
 #include <deal.II/base/memory_space.h>
+#include <deal.II/base/memory_space_data.h>
 #include <deal.II/base/mpi.h>
 #include <deal.II/base/numbers.h>
 #include <deal.II/base/partitioner.h>
index 7f6850212de74b320e12111feba8e483f71d55d1..9f1d50fdd04b4f381cf9c047535e2416550ec303 100644 (file)
@@ -20,6 +20,7 @@
 #include <deal.II/base/config.h>
 
 #include <deal.II/base/memory_space.h>
+#include <deal.II/base/memory_space_data.h>
 #include <deal.II/base/multithread_info.h>
 #include <deal.II/base/parallel.h>
 #include <deal.II/base/types.h>

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.