44 #ifndef KOKKOS_HBWSPACE_HPP 45 #define KOKKOS_HBWSPACE_HPP 47 #include <Kokkos_Macros.hpp> 48 #ifdef KOKKOS_ENABLE_HBWSPACE 50 #include <Kokkos_HostSpace.hpp> 64 void init_lock_array_hbw_space();
71 bool lock_address_hbw_space(
void* ptr );
79 void unlock_address_hbw_space(
void* ptr );
99 typedef HBWSpace memory_space;
100 typedef size_t size_type;
108 #if defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_OPENMP ) 109 typedef Kokkos::OpenMP execution_space;
110 #elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_THREADS ) 111 typedef Kokkos::Threads execution_space;
114 #elif defined( KOKKOS_ENABLE_OPENMP ) 115 typedef Kokkos::OpenMP execution_space;
116 #elif defined( KOKKOS_ENABLE_THREADS ) 117 typedef Kokkos::Threads execution_space;
120 #elif defined( KOKKOS_ENABLE_SERIAL ) 121 typedef Kokkos::Serial execution_space;
123 # error "At least one of the following host execution spaces must be defined: Kokkos::OpenMP, Kokkos::Threads, Kokkos::Qhreads, or Kokkos::Serial. You might be seeing this message if you disabled the Kokkos::Serial device explicitly using the Kokkos_ENABLE_Serial:BOOL=OFF CMake option, but did not enable any of the other host execution space devices." 131 static int in_parallel();
133 static void register_in_parallel(
int (*)() );
139 HBWSpace(
const HBWSpace & rhs ) =
default;
140 HBWSpace & operator = (
const HBWSpace & ) =
default;
141 ~HBWSpace() =
default;
145 enum AllocationMechanism { STD_MALLOC, POSIX_MEMALIGN, POSIX_MMAP, INTEL_MM_ALLOC };
148 HBWSpace(
const AllocationMechanism & );
151 void * allocate(
const size_t arg_alloc_size )
const;
154 void deallocate(
void *
const arg_alloc_ptr
155 ,
const size_t arg_alloc_size )
const;
158 static constexpr
const char* name();
162 AllocationMechanism m_alloc_mech;
163 static constexpr
const char* m_name =
"HBW";
164 friend class Kokkos::Impl::SharedAllocationRecord<
Kokkos::Experimental::HBWSpace, void >;
178 class SharedAllocationRecord<
Kokkos::Experimental::HBWSpace, void >
179 :
public SharedAllocationRecord< void, void >
183 friend Kokkos::Experimental::HBWSpace;
185 typedef SharedAllocationRecord< void, void > RecordBase;
187 SharedAllocationRecord(
const SharedAllocationRecord & ) =
delete;
188 SharedAllocationRecord & operator = (
const SharedAllocationRecord & ) =
delete;
190 static void deallocate( RecordBase * );
193 static RecordBase s_root_record;
195 const Kokkos::Experimental::HBWSpace m_space;
199 ~SharedAllocationRecord();
200 SharedAllocationRecord() =
default;
202 SharedAllocationRecord(
const Kokkos::Experimental::HBWSpace & arg_space
203 ,
const std::string & arg_label
204 ,
const size_t arg_alloc_size
205 ,
const RecordBase::function_type arg_dealloc = & deallocate
211 std::string get_label()
const 213 return std::string( RecordBase::head()->m_label );
216 KOKKOS_INLINE_FUNCTION
static 217 SharedAllocationRecord * allocate(
const Kokkos::Experimental::HBWSpace & arg_space
218 ,
const std::string & arg_label
219 ,
const size_t arg_alloc_size
222 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) 223 return new SharedAllocationRecord( arg_space, arg_label, arg_alloc_size );
225 return (SharedAllocationRecord *) 0;
231 void * allocate_tracked(
const Kokkos::Experimental::HBWSpace & arg_space
232 ,
const std::string & arg_label
233 ,
const size_t arg_alloc_size );
237 void * reallocate_tracked(
void *
const arg_alloc_ptr
238 ,
const size_t arg_alloc_size );
242 void deallocate_tracked(
void *
const arg_alloc_ptr );
244 static SharedAllocationRecord * get_record(
void * arg_alloc_ptr );
246 static void print_records( std::ostream &,
const Kokkos::Experimental::HBWSpace &,
bool detail =
false );
262 struct MemorySpaceAccess<
Kokkos::HostSpace, Kokkos::Experimental::HBWSpace > {
263 enum { assignable =
true };
264 enum { accessible =
true };
265 enum { deepcopy =
true };
270 enum { assignable =
false };
271 enum { accessible =
true };
272 enum { deepcopy =
true };
285 template<
class ExecutionSpace >
286 struct DeepCopy<
Experimental::HBWSpace, Experimental::HBWSpace, ExecutionSpace > {
287 DeepCopy(
void * dst,
const void * src,
size_t n ) {
288 memcpy( dst, src, n );
291 DeepCopy(
const ExecutionSpace& exec,
void * dst,
const void * src,
size_t n ) {
293 memcpy( dst, src, n );
297 template<
class ExecutionSpace >
298 struct DeepCopy< HostSpace,
Experimental::HBWSpace, ExecutionSpace > {
299 DeepCopy(
void * dst,
const void * src,
size_t n ) {
300 memcpy( dst, src, n );
303 DeepCopy(
const ExecutionSpace& exec,
void * dst,
const void * src,
size_t n ) {
305 memcpy( dst, src, n );
309 template<
class ExecutionSpace >
310 struct DeepCopy<
Experimental::HBWSpace, HostSpace, ExecutionSpace > {
311 DeepCopy(
void * dst,
const void * src,
size_t n ) {
312 memcpy( dst, src, n );
315 DeepCopy(
const ExecutionSpace& exec,
void * dst,
const void * src,
size_t n ) {
317 memcpy( dst, src, n );
330 struct VerifyExecutionCanAccessMemorySpace<
Kokkos::HostSpace, Kokkos::Experimental::HBWSpace >
332 enum { value =
true };
333 inline static void verify(
void ) { }
334 inline static void verify(
const void * ) { }
340 enum { value =
true };
341 inline static void verify(
void ) { }
342 inline static void verify(
const void * ) { }
350 #endif // #define KOKKOS_HBWSPACE_HPP
Memory space for main process and CPU execution spaces.
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.