45 #ifndef KOKKOS_HBWSPACE_HPP 46 #define KOKKOS_HBWSPACE_HPP 48 #include <Kokkos_Macros.hpp> 49 #ifdef KOKKOS_ENABLE_HBWSPACE 51 #include <Kokkos_HostSpace.hpp> 65 void init_lock_array_hbw_space();
72 bool lock_address_hbw_space(
void* ptr);
80 void unlock_address_hbw_space(
void* ptr);
100 using memory_space = HBWSpace;
101 using size_type = size_t;
109 using execution_space = Kokkos::DefaultHostExecutionSpace;
112 using device_type = Kokkos::Device<execution_space, memory_space>;
116 HBWSpace(
const HBWSpace& rhs) =
default;
117 HBWSpace& operator=(
const HBWSpace&) =
default;
118 ~HBWSpace() =
default;
123 enum AllocationMechanism {
130 explicit HBWSpace(
const AllocationMechanism&);
133 void* allocate(
const size_t arg_alloc_size)
const;
134 void* allocate(
const char* arg_label,
const size_t arg_alloc_size,
135 const size_t arg_logical_size = 0)
const;
138 void deallocate(
void*
const arg_alloc_ptr,
const size_t arg_alloc_size)
const;
139 void deallocate(
const char* arg_label,
void*
const arg_alloc_ptr,
140 const size_t arg_alloc_size,
141 const size_t arg_logical_size = 0)
const;
144 template <
class,
class,
class,
class>
145 friend class LogicalMemorySpace;
147 void* impl_allocate(
const char* arg_label,
const size_t arg_alloc_size,
148 const size_t arg_logical_size = 0,
149 const Kokkos::Tools::SpaceHandle =
150 Kokkos::Tools::make_space_handle(name()))
const;
151 void impl_deallocate(
const char* arg_label,
void*
const arg_alloc_ptr,
152 const size_t arg_alloc_size,
153 const size_t arg_logical_size = 0,
154 const Kokkos::Tools::SpaceHandle =
155 Kokkos::Tools::make_space_handle(name()))
const;
159 static constexpr
const char* name() {
return "HBW"; }
162 AllocationMechanism m_alloc_mech;
163 friend class Kokkos::Impl::SharedAllocationRecord<
164 Kokkos::Experimental::HBWSpace, void>;
178 class SharedAllocationRecord<
Kokkos::Experimental::HBWSpace, void>
179 :
public SharedAllocationRecord<void, void> {
181 friend Kokkos::Experimental::HBWSpace;
183 using RecordBase = SharedAllocationRecord<void, void>;
185 SharedAllocationRecord(
const SharedAllocationRecord&) =
delete;
186 SharedAllocationRecord& operator=(
const SharedAllocationRecord&) =
delete;
188 static void deallocate(RecordBase*);
190 #ifdef KOKKOS_ENABLE_DEBUG 192 static RecordBase s_root_record;
195 const Kokkos::Experimental::HBWSpace m_space;
198 ~SharedAllocationRecord()
200 KOKKOS_IMPL_INTEL_WORKAROUND_NOEXCEPT_SPECIFICATION_VIRTUAL_FUNCTION) 204 SharedAllocationRecord() =
default;
206 SharedAllocationRecord(
207 const Kokkos::Experimental::HBWSpace& arg_space,
208 const std::string& arg_label,
const size_t arg_alloc_size,
209 const RecordBase::function_type arg_dealloc = &deallocate);
212 inline std::string get_label()
const {
213 return std::string(RecordBase::head()->m_label);
216 KOKKOS_INLINE_FUNCTION
static SharedAllocationRecord* allocate(
217 const Kokkos::Experimental::HBWSpace& arg_space,
218 const std::string& arg_label,
const size_t arg_alloc_size) {
219 #if defined(KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST) 220 return new SharedAllocationRecord(arg_space, arg_label, arg_alloc_size);
222 return (SharedAllocationRecord*)0;
227 static void* allocate_tracked(
const Kokkos::Experimental::HBWSpace& arg_space,
228 const std::string& arg_label,
229 const size_t arg_alloc_size);
232 static void* reallocate_tracked(
void*
const arg_alloc_ptr,
233 const size_t arg_alloc_size);
236 static void deallocate_tracked(
void*
const arg_alloc_ptr);
238 static SharedAllocationRecord* get_record(
void* arg_alloc_ptr);
240 static void print_records(std::ostream&,
241 const Kokkos::Experimental::HBWSpace&,
242 bool detail =
false);
257 Kokkos::Experimental::HBWSpace>::assignable,
261 struct MemorySpaceAccess<
Kokkos::HostSpace, Kokkos::Experimental::HBWSpace> {
262 enum :
bool { assignable =
true };
263 enum :
bool { accessible =
true };
264 enum :
bool { deepcopy =
true };
269 enum :
bool { assignable =
false };
270 enum :
bool { accessible =
true };
271 enum :
bool { deepcopy =
true };
284 template <
class ExecutionSpace>
285 struct DeepCopy<
Kokkos::Experimental::HBWSpace, Kokkos::Experimental::HBWSpace,
287 DeepCopy(
void* dst,
const void* src,
size_t n) { memcpy(dst, src, n); }
289 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
295 template <
class ExecutionSpace>
296 struct DeepCopy<HostSpace,
Kokkos::Experimental::HBWSpace, ExecutionSpace> {
297 DeepCopy(
void* dst,
const void* src,
size_t n) { memcpy(dst, src, n); }
299 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
305 template <
class ExecutionSpace>
306 struct DeepCopy<
Kokkos::Experimental::HBWSpace, HostSpace, ExecutionSpace> {
307 DeepCopy(
void* dst,
const void* src,
size_t n) { memcpy(dst, src, n); }
309 DeepCopy(
const ExecutionSpace& exec,
void* dst,
const void* src,
size_t n) {
320 #endif // #define KOKKOS_HBWSPACE_HPP
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.