44 #ifndef KOKKOS_HBWSPACE_HPP 45 #define KOKKOS_HBWSPACE_HPP 48 #include <Kokkos_HostSpace.hpp> 51 #ifdef KOKKOS_HAVE_HBWSPACE 54 namespace Experimental {
63 void init_lock_array_hbw_space();
70 bool lock_address_hbw_space(
void* ptr);
78 void unlock_address_hbw_space(
void* ptr);
85 namespace Experimental {
96 typedef HBWSpace memory_space ;
97 typedef size_t size_type ;
105 #if defined( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_OPENMP ) 106 typedef Kokkos::OpenMP execution_space ;
107 #elif defined( KOKKOS_HAVE_DEFAULT_DEVICE_TYPE_THREADS ) 108 typedef Kokkos::Threads execution_space ;
109 #elif defined( KOKKOS_HAVE_OPENMP ) 110 typedef Kokkos::OpenMP execution_space ;
111 #elif defined( KOKKOS_HAVE_PTHREAD ) 112 typedef Kokkos::Threads execution_space ;
113 #elif defined( KOKKOS_HAVE_SERIAL ) 114 typedef Kokkos::Serial execution_space ;
116 # 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 static int in_parallel();
126 static void register_in_parallel(
int (*)() );
132 HBWSpace(
const HBWSpace & rhs ) = default ;
133 HBWSpace & operator = (
const HBWSpace & ) = default ;
134 ~HBWSpace() = default ;
138 enum AllocationMechanism { STD_MALLOC , POSIX_MEMALIGN , POSIX_MMAP , INTEL_MM_ALLOC };
141 HBWSpace(
const AllocationMechanism & );
144 void * allocate(
const size_t arg_alloc_size )
const ;
147 void deallocate(
void *
const arg_alloc_ptr
148 ,
const size_t arg_alloc_size )
const ;
152 AllocationMechanism m_alloc_mech ;
154 friend class Kokkos::Impl::SharedAllocationRecord<
Kokkos::Experimental::HBWSpace , void > ;
167 class SharedAllocationRecord<
Kokkos::Experimental::HBWSpace , void >
168 :
public SharedAllocationRecord< void , void >
172 friend Kokkos::Experimental::HBWSpace ;
174 typedef SharedAllocationRecord< void , void > RecordBase ;
176 SharedAllocationRecord(
const SharedAllocationRecord & ) = delete ;
177 SharedAllocationRecord & operator = (
const SharedAllocationRecord & ) = delete ;
179 static void deallocate( RecordBase * );
182 static RecordBase s_root_record ;
184 const Kokkos::Experimental::HBWSpace m_space ;
188 ~SharedAllocationRecord();
189 SharedAllocationRecord() = default ;
191 SharedAllocationRecord(
const Kokkos::Experimental::HBWSpace & arg_space
192 ,
const std::string & arg_label
193 ,
const size_t arg_alloc_size
194 ,
const RecordBase::function_type arg_dealloc = & deallocate
200 std::string get_label()
const 202 return std::string( RecordBase::head()->m_label );
205 KOKKOS_INLINE_FUNCTION
static 206 SharedAllocationRecord * allocate(
const Kokkos::Experimental::HBWSpace & arg_space
207 ,
const std::string & arg_label
208 ,
const size_t arg_alloc_size
211 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST ) 212 return new SharedAllocationRecord( arg_space , arg_label , arg_alloc_size );
214 return (SharedAllocationRecord *) 0 ;
220 void * allocate_tracked(
const Kokkos::Experimental::HBWSpace & arg_space
221 ,
const std::string & arg_label
222 ,
const size_t arg_alloc_size );
226 void * reallocate_tracked(
void *
const arg_alloc_ptr
227 ,
const size_t arg_alloc_size );
231 void deallocate_tracked(
void *
const arg_alloc_ptr );
234 static SharedAllocationRecord * get_record(
void * arg_alloc_ptr );
236 static void print_records( std::ostream & ,
const Kokkos::Experimental::HBWSpace & ,
bool detail =
false );
249 template<
class ExecutionSpace>
250 struct DeepCopy<Experimental::HBWSpace,Experimental::HBWSpace,ExecutionSpace> {
251 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
252 memcpy( dst , src , n );
254 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
256 memcpy( dst , src , n );
260 template<
class ExecutionSpace>
261 struct DeepCopy<HostSpace,Experimental::HBWSpace,ExecutionSpace> {
262 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
263 memcpy( dst , src , n );
265 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
267 memcpy( dst , src , n );
271 template<
class ExecutionSpace>
272 struct DeepCopy<Experimental::HBWSpace,HostSpace,ExecutionSpace> {
273 DeepCopy(
void * dst ,
const void * src ,
size_t n ) {
274 memcpy( dst , src , n );
276 DeepCopy(
const ExecutionSpace& exec,
void * dst ,
const void * src ,
size_t n ) {
278 memcpy( dst , src , n );
289 struct VerifyExecutionCanAccessMemorySpace<
Kokkos::HostSpace , Kokkos::Experimental::HBWSpace >
291 enum { value =
true };
292 inline static void verify(
void ) { }
293 inline static void verify(
const void * ) { }
299 enum { value =
true };
300 inline static void verify(
void ) { }
301 inline static void verify(
const void * ) { }
Memory space for main process and CPU execution spaces.
Memory management for host memory.