17 #ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
18 #include <Kokkos_Macros.hpp>
20 "Including non-public Kokkos header files is not allowed.");
22 #ifndef KOKKOS_HBWSPACE_HPP
23 #define KOKKOS_HBWSPACE_HPP
25 #include <Kokkos_Macros.hpp>
26 #ifdef KOKKOS_ENABLE_HBWSPACE
28 #include <Kokkos_HostSpace.hpp>
32 namespace Experimental {
42 using memory_space = HBWSpace;
43 using size_type = size_t;
51 using execution_space = Kokkos::DefaultHostExecutionSpace;
54 using device_type = Kokkos::Device<execution_space, memory_space>;
58 HBWSpace(
const HBWSpace& rhs) =
default;
59 HBWSpace& operator=(
const HBWSpace&) =
default;
60 ~HBWSpace() =
default;
65 enum AllocationMechanism {
72 explicit HBWSpace(
const AllocationMechanism&);
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;
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;
86 template <
class,
class,
class,
class>
87 friend class LogicalMemorySpace;
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;
101 static constexpr
const char* name() {
return "HBW"; }
104 AllocationMechanism m_alloc_mech;
105 friend class Kokkos::Impl::SharedAllocationRecord<
106 Kokkos::Experimental::HBWSpace, void>;
120 class SharedAllocationRecord<Kokkos::Experimental::HBWSpace, void>
121 :
public SharedAllocationRecord<void, void> {
123 friend Kokkos::Experimental::HBWSpace;
125 using RecordBase = SharedAllocationRecord<void, void>;
127 SharedAllocationRecord(
const SharedAllocationRecord&) =
delete;
128 SharedAllocationRecord& operator=(
const SharedAllocationRecord&) =
delete;
130 static void deallocate(RecordBase*);
132 #ifdef KOKKOS_ENABLE_DEBUG
134 static RecordBase s_root_record;
137 const Kokkos::Experimental::HBWSpace m_space;
140 ~SharedAllocationRecord();
141 SharedAllocationRecord() =
default;
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);
149 inline std::string get_label()
const {
150 return std::string(RecordBase::head()->m_label);
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,
158 KOKKOS_IF_ON_DEVICE(((
void)arg_space; (
void)arg_label; (
void)arg_alloc_size;
163 static
void* allocate_tracked(const Kokkos::Experimental::HBWSpace& arg_space,
164 const std::
string& arg_label,
165 const
size_t arg_alloc_size);
168 static
void* reallocate_tracked(
void* const arg_alloc_ptr,
169 const
size_t arg_alloc_size);
172 static
void deallocate_tracked(
void* const arg_alloc_ptr);
174 static SharedAllocationRecord* get_record(
void* arg_alloc_ptr);
176 static
void print_records(std::ostream&,
177 const Kokkos::Experimental::HBWSpace&,
178 bool detail = false);
193 Kokkos::Experimental::HBWSpace>::assignable,
197 struct MemorySpaceAccess<Kokkos::HostSpace, Kokkos::Experimental::HBWSpace> {
198 enum :
bool { assignable =
true };
199 enum :
bool { accessible =
true };
200 enum :
bool { deepcopy =
true };
205 enum :
bool { assignable =
false };
206 enum :
bool { accessible =
true };
207 enum :
bool { deepcopy =
true };
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);
227 DeepCopy(
const DefaultHostExecutionSpace& exec,
void* dst,
const void* src,
229 hostspace_parallel_deepcopy(exec, dst, src, n);
233 template <
class ExecutionSpace>
234 struct DeepCopy<Kokkos::Experimental::HBWSpace, Kokkos::Experimental::HBWSpace,
236 DeepCopy(
void* dst,
const void* src,
size_t n) {
237 hostspace_parallel_deepcopy(dst, src, n);
240 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
242 "Kokkos::Impl::DeepCopy<Kokkos::Experimental::HBWSpace, "
243 "Kokkos::Experimental::HBWSpace,ExecutionSpace::DeepCopy: fence "
245 hostspace_parallel_deepcopy_async(dst, src, n);
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);
256 DeepCopy(
const DefaultHostExecutionSpace& exec,
void* dst,
const void* src,
258 hostspace_parallel_deepcopy(exec, dst, src, n);
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);
268 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
270 "Kokkos::Impl::DeepCopy<HostSpace, Kokkos::Experimental::HBWSpace, "
271 "ExecutionSpace>::DeepCopy: fence before copy");
272 hostspace_parallel_deepcopy_async(copy_space, dst, src, n);
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);
283 DeepCopy(
const DefaultHostExecutionSpace& exec,
void* dst,
const void* src,
285 hostspace_parallel_deepcopy(exec, dst, src, n);
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);
295 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
297 "Kokkos::Impl::DeepCopy<Kokkos::Experimental::HBWSpace, HostSpace, "
298 "ExecutionSpace>::DeepCopy: fence before copy");
299 hostspace_parallel_deepcopy_async(dst, src, n);
308 #endif // #define KOKKOS_HBWSPACE_HPP
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.