]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Make MemorySpaceData virtual 10873/head
authorPeter Munch <peterrmuench@gmail.com>
Tue, 1 Sep 2020 17:17:27 +0000 (19:17 +0200)
committerPeter Munch <peterrmuench@gmail.com>
Tue, 1 Sep 2020 19:51:04 +0000 (21:51 +0200)
include/deal.II/base/memory_space.h
include/deal.II/lac/la_parallel_vector.templates.h

index c4841e00b3d9f2e9588b4706410238990f4f2643..8a475d320c234d5da80da374761b67355d7ced89 100644 (file)
@@ -22,6 +22,7 @@
 #include <deal.II/base/cuda.h>
 #include <deal.II/base/exceptions.h>
 
+#include <functional>
 #include <memory>
 
 DEAL_II_NAMESPACE_OPEN
@@ -63,7 +64,7 @@ namespace MemorySpace
      * 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.
      */
-    void
+    virtual void
     copy_to(Number *begin, std::size_t n_elements)
     {
       (void)begin;
@@ -74,7 +75,7 @@ namespace MemorySpace
      * 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.
      */
-    void
+    virtual void
     copy_from(Number *begin, std::size_t n_elements)
     {
       (void)begin;
@@ -84,7 +85,7 @@ namespace MemorySpace
     /**
      * Pointer to data on the host.
      */
-    std::unique_ptr<Number[], decltype(&std::free)> values;
+    std::unique_ptr<Number[], std::function<void(Number *)>> values;
 
     /**
      * Pointer to data on the device.
@@ -116,19 +117,19 @@ namespace MemorySpace
       : values(nullptr, &std::free)
     {}
 
-    void
+    virtual void
     copy_to(Number *begin, std::size_t n_elements)
     {
       std::copy(values.get(), values.get() + n_elements, begin);
     }
 
-    void
+    virtual void
     copy_from(Number *begin, std::size_t n_elements)
     {
       std::copy(begin, begin + n_elements, values.get());
     }
 
-    std::unique_ptr<Number[], decltype(&std::free)> values;
+    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.
@@ -156,7 +157,7 @@ namespace MemorySpace
       , values_dev(nullptr, Utilities::CUDA::delete_device_data<Number>)
     {}
 
-    void
+    virtual void
     copy_to(Number *begin, std::size_t n_elements)
     {
       const cudaError_t cuda_error_code =
@@ -167,7 +168,7 @@ namespace MemorySpace
       AssertCuda(cuda_error_code);
     }
 
-    void
+    virtual void
     copy_from(Number *begin, std::size_t n_elements)
     {
       const cudaError_t cuda_error_code =
@@ -178,8 +179,8 @@ namespace MemorySpace
       AssertCuda(cuda_error_code);
     }
 
-    std::unique_ptr<Number[], decltype(&std::free)> values;
-    std::unique_ptr<Number[], void (*)(Number *)>   values_dev;
+    std::unique_ptr<Number[], std::function<void(Number *)>> values;
+    std::unique_ptr<Number[], void (*)(Number *)>            values_dev;
   };
 
 
index e916e86fcd406330379723b625aa7504e09a3424..d406a1610a2fa66fd4db0ef6af74b5481af25721 100644 (file)
@@ -141,7 +141,7 @@ namespace LinearAlgebra
                 reinterpret_cast<void **>(&new_val),
                 64,
                 sizeof(Number) * new_alloc_size);
-              data.values.reset(new_val);
+              data.values = {new_val, [](Number *data) { std::free(data); }};
 
               allocated_size = new_alloc_size;
             }
@@ -852,7 +852,7 @@ namespace LinearAlgebra
                                             64,
                                             sizeof(Number) * allocated_size);
 
-          data.values.reset(new_val);
+          data.values = {new_val, [](Number *data) { std::free(data); }};
 
           cudaError_t cuda_error_code =
             cudaMemcpy(data.values.get(),
@@ -1030,7 +1030,7 @@ namespace LinearAlgebra
                                         64,
                                         sizeof(Number) * allocated_size);
 
-      data.values.reset(new_val);
+      data.values = {new_val, [](Number *data) { std::free(data); }};
 
       cudaError_t cuda_error_code = cudaMemcpy(data.values.get(),
                                                data.values_dev.get(),

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.