Kokkos Core Kernels Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
Kokkos_HBWSpace.hpp
1 //@HEADER
2 // ************************************************************************
3 //
4 // Kokkos v. 4.0
5 // Copyright (2022) National Technology & Engineering
6 // Solutions of Sandia, LLC (NTESS).
7 //
8 // Under the terms of Contract DE-NA0003525 with NTESS,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions.
12 // See https://kokkos.org/LICENSE for license information.
13 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
14 //
15 //@HEADER
16 
17 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
18 #include <Kokkos_Macros.hpp>
19 static_assert(false,
20  "Including non-public Kokkos header files is not allowed.");
21 #endif
22 #ifndef KOKKOS_HBWSPACE_HPP
23 #define KOKKOS_HBWSPACE_HPP
24 
25 #include <Kokkos_Macros.hpp>
26 #ifdef KOKKOS_ENABLE_HBWSPACE
27 
28 #include <Kokkos_HostSpace.hpp>
29 
30 namespace Kokkos {
31 
32 namespace Experimental {
33 
39 class HBWSpace {
40  public:
42  using memory_space = HBWSpace;
43  using size_type = size_t;
44 
51  using execution_space = Kokkos::DefaultHostExecutionSpace;
52 
54  using device_type = Kokkos::Device<execution_space, memory_space>;
55 
57  HBWSpace();
58  HBWSpace(const HBWSpace& rhs) = default;
59  HBWSpace& operator=(const HBWSpace&) = default;
60  ~HBWSpace() = default;
61 
65  enum AllocationMechanism {
66  STD_MALLOC,
67  POSIX_MEMALIGN,
68  POSIX_MMAP,
69  INTEL_MM_ALLOC
70  };
71 
72  explicit HBWSpace(const AllocationMechanism&);
73 
75  void* allocate(const size_t arg_alloc_size) const;
76  void* allocate(const char* arg_label, const size_t arg_alloc_size,
77  const size_t arg_logical_size = 0) const;
78 
80  void deallocate(void* const arg_alloc_ptr, const size_t arg_alloc_size) const;
81  void deallocate(const char* arg_label, void* const arg_alloc_ptr,
82  const size_t arg_alloc_size,
83  const size_t arg_logical_size = 0) const;
84 
85  private:
86  template <class, class, class, class>
87  friend class LogicalMemorySpace;
88 
89  void* impl_allocate(const char* arg_label, const size_t arg_alloc_size,
90  const size_t arg_logical_size = 0,
91  const Kokkos::Tools::SpaceHandle =
92  Kokkos::Tools::make_space_handle(name())) const;
93  void impl_deallocate(const char* arg_label, void* const arg_alloc_ptr,
94  const size_t arg_alloc_size,
95  const size_t arg_logical_size = 0,
96  const Kokkos::Tools::SpaceHandle =
97  Kokkos::Tools::make_space_handle(name())) const;
98 
99  public:
101  static constexpr const char* name() { return "HBW"; }
102 
103  private:
104  AllocationMechanism m_alloc_mech;
105  friend class Kokkos::Impl::SharedAllocationRecord<
106  Kokkos::Experimental::HBWSpace, void>;
107 };
108 
109 } // namespace Experimental
110 
111 } // namespace Kokkos
112 
113 //----------------------------------------------------------------------------
114 
115 namespace Kokkos {
116 
117 namespace Impl {
118 
119 template <>
120 class SharedAllocationRecord<Kokkos::Experimental::HBWSpace, void>
121  : public SharedAllocationRecord<void, void> {
122  private:
123  friend Kokkos::Experimental::HBWSpace;
124 
125  using RecordBase = SharedAllocationRecord<void, void>;
126 
127  SharedAllocationRecord(const SharedAllocationRecord&) = delete;
128  SharedAllocationRecord& operator=(const SharedAllocationRecord&) = delete;
129 
130  static void deallocate(RecordBase*);
131 
132 #ifdef KOKKOS_ENABLE_DEBUG
133 
134  static RecordBase s_root_record;
135 #endif
136 
137  const Kokkos::Experimental::HBWSpace m_space;
138 
139  protected:
140  ~SharedAllocationRecord();
141  SharedAllocationRecord() = default;
142 
143  SharedAllocationRecord(
144  const Kokkos::Experimental::HBWSpace& arg_space,
145  const std::string& arg_label, const size_t arg_alloc_size,
146  const RecordBase::function_type arg_dealloc = &deallocate);
147 
148  public:
149  inline std::string get_label() const {
150  return std::string(RecordBase::head()->m_label);
151  }
152 
153  KOKKOS_INLINE_FUNCTION static SharedAllocationRecord* allocate(
154  const Kokkos::Experimental::HBWSpace& arg_space,
155  const std::string& arg_label, const size_t arg_alloc_size) {
156  KOKKOS_IF_ON_HOST((return new SharedAllocationRecord(arg_space, arg_label,
157  arg_alloc_size);))
158  KOKKOS_IF_ON_DEVICE(((void)arg_space; (void)arg_label; (void)arg_alloc_size;
159  return nullptr;))
160  }
161 
163  static void* allocate_tracked(const Kokkos::Experimental::HBWSpace& arg_space,
164  const std::string& arg_label,
165  const size_t arg_alloc_size);
166 
168  static void* reallocate_tracked(void* const arg_alloc_ptr,
169  const size_t arg_alloc_size);
170 
172  static void deallocate_tracked(void* const arg_alloc_ptr);
173 
174  static SharedAllocationRecord* get_record(void* arg_alloc_ptr);
175 
176  static void print_records(std::ostream&,
177  const Kokkos::Experimental::HBWSpace&,
178  bool detail = false);
179 };
180 
181 } // namespace Impl
182 
183 } // namespace Kokkos
184 
185 //----------------------------------------------------------------------------
186 
187 namespace Kokkos {
188 
189 namespace Impl {
190 
191 static_assert(
192  Kokkos::Impl::MemorySpaceAccess<Kokkos::Experimental::HBWSpace,
193  Kokkos::Experimental::HBWSpace>::assignable,
194  "");
195 
196 template <>
197 struct MemorySpaceAccess<Kokkos::HostSpace, Kokkos::Experimental::HBWSpace> {
198  enum : bool { assignable = true };
199  enum : bool { accessible = true };
200  enum : bool { deepcopy = true };
201 };
202 
203 template <>
204 struct MemorySpaceAccess<Kokkos::Experimental::HBWSpace, Kokkos::HostSpace> {
205  enum : bool { assignable = false };
206  enum : bool { accessible = true };
207  enum : bool { deepcopy = true };
208 };
209 
210 } // namespace Impl
211 
212 } // namespace Kokkos
213 
214 //----------------------------------------------------------------------------
215 
216 namespace Kokkos {
217 
218 namespace Impl {
219 
220 template <>
221 struct DeepCopy<Kokkos::Experimental::HBWSpace, Kokkos::Experimental::HBWSpace,
222  DefaultHostExecutionSpace> {
223  DeepCopy(void* dst, const void* src, size_t n) {
224  hostspace_parallel_deepcopy(dst, src, n);
225  }
226 
227  DeepCopy(const DefaultHostExecutionSpace& exec, void* dst, const void* src,
228  size_t n) {
229  hostspace_parallel_deepcopy(exec, dst, src, n);
230  }
231 };
232 
233 template <class ExecutionSpace>
234 struct DeepCopy<Kokkos::Experimental::HBWSpace, Kokkos::Experimental::HBWSpace,
235  ExecutionSpace> {
236  DeepCopy(void* dst, const void* src, size_t n) {
237  hostspace_parallel_deepcopy(dst, src, n);
238  }
239 
240  DeepCopy(const ExecutionSpace& exec, void* dst, const void* src, size_t n) {
241  exec.fence(
242  "Kokkos::Impl::DeepCopy<Kokkos::Experimental::HBWSpace, "
243  "Kokkos::Experimental::HBWSpace,ExecutionSpace::DeepCopy: fence "
244  "before copy");
245  hostspace_parallel_deepcopy_async(dst, src, n);
246  }
247 };
248 
249 template <>
250 struct DeepCopy<HostSpace, Kokkos::Experimental::HBWSpace,
251  DefaultHostExecutionSpace> {
252  DeepCopy(void* dst, const void* src, size_t n) {
253  hostspace_parallel_deepcopy(dst, src, n);
254  }
255 
256  DeepCopy(const DefaultHostExecutionSpace& exec, void* dst, const void* src,
257  size_t n) {
258  hostspace_parallel_deepcopy(exec, dst, src, n);
259  }
260 };
261 
262 template <class ExecutionSpace>
263 struct DeepCopy<HostSpace, Kokkos::Experimental::HBWSpace, ExecutionSpace> {
264  DeepCopy(void* dst, const void* src, size_t n) {
265  hostspace_parallel_deepcopy(dst, src, n);
266  }
267 
268  DeepCopy(const ExecutionSpace& exec, void* dst, const void* src, size_t n) {
269  exec.fence(
270  "Kokkos::Impl::DeepCopy<HostSpace, Kokkos::Experimental::HBWSpace, "
271  "ExecutionSpace>::DeepCopy: fence before copy");
272  hostspace_parallel_deepcopy_async(copy_space, dst, src, n);
273  }
274 };
275 
276 template <>
277 struct DeepCopy<Kokkos::Experimental::HBWSpace, HostSpace,
278  DefaultHostExecutionSpace> {
279  DeepCopy(void* dst, const void* src, size_t n) {
280  hostspace_parallel_deepcopy(dst, src, n);
281  }
282 
283  DeepCopy(const DefaultHostExecutionSpace& exec, void* dst, const void* src,
284  size_t n) {
285  hostspace_parallel_deepcopy(exec, dst, src, n);
286  }
287 };
288 
289 template <class ExecutionSpace>
290 struct DeepCopy<Kokkos::Experimental::HBWSpace, HostSpace, ExecutionSpace> {
291  DeepCopy(void* dst, const void* src, size_t n) {
292  hostspace_parallel_deepcopy(dst, src, n);
293  }
294 
295  DeepCopy(const ExecutionSpace& exec, void* dst, const void* src, size_t n) {
296  exec.fence(
297  "Kokkos::Impl::DeepCopy<Kokkos::Experimental::HBWSpace, HostSpace, "
298  "ExecutionSpace>::DeepCopy: fence before copy");
299  hostspace_parallel_deepcopy_async(dst, src, n);
300  }
301 };
302 
303 } // namespace Impl
304 
305 } // namespace Kokkos
306 
307 #endif
308 #endif // #define KOKKOS_HBWSPACE_HPP
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.