44 #ifndef KOKKOS_HBWSPACE_HPP 45 #define KOKKOS_HBWSPACE_HPP 48 #include <Kokkos_HostSpace.hpp> 49 #include <impl/Kokkos_HBWAllocators.hpp> 52 #ifdef KOKKOS_HAVE_HBWSPACE 64 void init_lock_array_hbw_space();
71 bool lock_address_hbw_space(
void* ptr);
79 void unlock_address_hbw_space(
void* ptr);
97 typedef HBWSpace memory_space ;
98 typedef size_t size_type ;
106 #if defined( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_OPENMP ) 107 typedef Kokkos::OpenMP execution_space ;
108 #elif defined( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_THREADS ) 109 typedef Kokkos::Threads execution_space ;
110 #elif defined( KOKKOS_HAVE_OPENMP ) 111 typedef Kokkos::OpenMP execution_space ;
112 #elif defined( KOKKOS_HAVE_PTHREAD ) 113 typedef Kokkos::Threads execution_space ;
114 #elif defined( KOKKOS_HAVE_SERIAL ) 115 typedef Kokkos::Serial execution_space ;
117 # error "At least one of the following host execution spaces must be defined: Kokkos::OpenMP, Kokkos::Serial, or Kokkos::Threads. 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." 124 #if ! defined( KOKKOS_USING_EXPERIMENTAL_VIEW ) 126 typedef Impl::HBWMallocAllocator allocator ;
134 static Kokkos::Impl::AllocationTracker allocate_and_track(
const std::string & label,
const size_t size );
140 static int in_parallel();
142 static void register_in_parallel(
int (*)() );
148 HBWSpace(
const HBWSpace & rhs ) = default ;
149 HBWSpace & operator = (
const HBWSpace & ) = default ;
150 ~HBWSpace() = default ;
154 enum AllocationMechanism { STD_MALLOC , POSIX_MEMALIGN , POSIX_MMAP , INTEL_MM_ALLOC };
157 HBWSpace(
const AllocationMechanism & );
160 void * allocate(
const size_t arg_alloc_size )
const ;
163 void deallocate(
void *
const arg_alloc_ptr
164 ,
const size_t arg_alloc_size )
const ;
168 AllocationMechanism m_alloc_mech ;
170 friend class Kokkos::Experimental::Impl::SharedAllocationRecord<
Kokkos::Experimental::HBWSpace , void > ;
184 class SharedAllocationRecord<
Kokkos::Experimental::HBWSpace , void >
185 :
public SharedAllocationRecord< void , void >
189 friend Kokkos::Experimental::HBWSpace ;
191 typedef SharedAllocationRecord< void , void > RecordBase ;
193 SharedAllocationRecord(
const SharedAllocationRecord & ) = delete ;
194 SharedAllocationRecord & operator = (
const SharedAllocationRecord & ) = delete ;
196 static void deallocate( RecordBase * );
199 static RecordBase s_root_record ;
201 const Kokkos::Experimental::HBWSpace m_space ;
205 ~SharedAllocationRecord();
206 SharedAllocationRecord() = default ;
208 SharedAllocationRecord(
const Kokkos::Experimental::HBWSpace & arg_space
209 ,
const std::string & arg_label
210 ,
const size_t arg_alloc_size
211 ,
const RecordBase::function_type arg_dealloc = & deallocate
217 std::string get_label()
const 219 return std::string( RecordBase::head()->m_label );
222 KOKKOS_INLINE_FUNCTION
static 223 SharedAllocationRecord * allocate(
const Kokkos::Experimental::HBWSpace & arg_space
224 ,
const std::string & arg_label
225 ,
const size_t arg_alloc_size
228 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) 229 return new SharedAllocationRecord( arg_space , arg_label , arg_alloc_size );
231 return (SharedAllocationRecord *) 0 ;
237 void * allocate_tracked(
const Kokkos::Experimental::HBWSpace & arg_space
238 ,
const std::string & arg_label
239 ,
const size_t arg_alloc_size );
243 void * reallocate_tracked(
void *
const arg_alloc_ptr
244 ,
const size_t arg_alloc_size );
248 void deallocate_tracked(
void *
const arg_alloc_ptr );
251 static SharedAllocationRecord * get_record(
void * arg_alloc_ptr );
253 static void print_records( std::ostream & ,
const Kokkos::Experimental::HBWSpace & ,
bool detail =
false );
267 template<
class ExecutionSpace>
268 struct DeepCopy<
Experimental::HBWSpace,Experimental::HBWSpace,ExecutionSpace> {
269 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
270 memcpy( dst , src , n );
272 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
274 memcpy( dst , src , n );
278 template<
class ExecutionSpace>
279 struct DeepCopy<HostSpace,
Experimental::HBWSpace,ExecutionSpace> {
280 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
281 memcpy( dst , src , n );
283 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
285 memcpy( dst , src , n );
289 template<
class ExecutionSpace>
290 struct DeepCopy<
Experimental::HBWSpace,HostSpace,ExecutionSpace> {
291 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
292 memcpy( dst , src , n );
294 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
296 memcpy( dst , src , n );
307 struct VerifyExecutionCanAccessMemorySpace<
Kokkos::HostSpace , Kokkos::Experimental::HBWSpace >
309 enum { value =
true };
310 inline static void verify(
void ) { }
311 inline static void verify(
const void * ) { }
317 enum { value =
true };
318 inline static void verify(
void ) { }
319 inline static void verify(
const void * ) { }
Memory space for main process and CPU execution spaces.
Memory management for host memory.