Kokkos Core Kernels Package Version of the Day
Loading...
Searching...
No Matches
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>
19static_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
30namespace Kokkos {
31
32namespace Experimental {
33
39class 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
64
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
115namespace Kokkos {
116
117namespace Impl {
118
119template <>
120class 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
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
187namespace Kokkos {
188
189namespace Impl {
190
191static_assert(
192 Kokkos::Impl::MemorySpaceAccess<Kokkos::Experimental::HBWSpace,
193 Kokkos::Experimental::HBWSpace>::assignable,
194 "");
195
196template <>
197struct MemorySpaceAccess<Kokkos::HostSpace, Kokkos::Experimental::HBWSpace> {
198 enum : bool { assignable = true };
199 enum : bool { accessible = true };
200 enum : bool { deepcopy = true };
201};
202
203template <>
204struct 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
216namespace Kokkos {
217
218namespace Impl {
219
220template <>
221struct 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
233template <class ExecutionSpace>
234struct 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
249template <>
250struct 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
262template <class ExecutionSpace>
263struct 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
276template <>
277struct 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
289template <class ExecutionSpace>
290struct 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
ScopeGuard Some user scope issues have been identified with some Kokkos::finalize calls; ScopeGuard a...
Access relationship between DstMemorySpace and SrcMemorySpace.