Kokkos Core Kernels Package  Version of the Day
Kokkos_HBWSpace.hpp
1 /*
2 //@HEADER
3 // ************************************************************************
4 //
5 // Kokkos v. 2.0
6 // Copyright (2014) Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact H. Carter Edwards (hcedwar@sandia.gov)
39 //
40 // ************************************************************************
41 //@HEADER
42 */
43 
44 #ifndef KOKKOS_HBWSPACE_HPP
45 #define KOKKOS_HBWSPACE_HPP
46 
47 #include <Kokkos_Macros.hpp>
48 #ifdef KOKKOS_ENABLE_HBWSPACE
49 
50 #include <Kokkos_HostSpace.hpp>
51 
52 namespace Kokkos {
53 
54 namespace Experimental {
55 
56 namespace Impl {
57 
64 void init_lock_array_hbw_space();
65 
71 bool lock_address_hbw_space( void* ptr );
72 
79 void unlock_address_hbw_space( void* ptr );
80 
81 } // namespace Impl
82 
83 } // namespace Experimental
84 
85 } // namespace Kokkos
86 
87 namespace Kokkos {
88 
89 namespace Experimental {
90 
96 class HBWSpace {
97 public:
99  typedef HBWSpace memory_space;
100  typedef size_t size_type;
101 
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;
112 //#elif defined( KOKKOS_ENABLE_DEFAULT_DEVICE_TYPE_QTHREADS )
113 // typedef Kokkos::Qthreads 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;
118 //#elif defined( KOKKOS_ENABLE_QTHREADS )
119 // typedef Kokkos::Qthreads execution_space;
120 #elif defined( KOKKOS_ENABLE_SERIAL )
121  typedef Kokkos::Serial execution_space;
122 #else
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."
124 #endif
125 
128 
129  /*--------------------------------*/
130  /* Functions unique to the HBWSpace */
131  static int in_parallel();
132 
133  static void register_in_parallel( int (*)() );
134 
135  /*--------------------------------*/
136 
138  HBWSpace();
139  HBWSpace( const HBWSpace & rhs ) = default;
140  HBWSpace & operator = ( const HBWSpace & ) = default;
141  ~HBWSpace() = default;
142 
145  enum AllocationMechanism { STD_MALLOC, POSIX_MEMALIGN, POSIX_MMAP, INTEL_MM_ALLOC };
146 
147  explicit
148  HBWSpace( const AllocationMechanism & );
149 
151  void * allocate( const size_t arg_alloc_size ) const;
152 
154  void deallocate( void * const arg_alloc_ptr
155  , const size_t arg_alloc_size ) const;
156 
158  static constexpr const char* name();
159 
160 private:
161 
162  AllocationMechanism m_alloc_mech;
163  static constexpr const char* m_name = "HBW";
164  friend class Kokkos::Impl::SharedAllocationRecord< Kokkos::Experimental::HBWSpace, void >;
165 };
166 
167 } // namespace Experimental
168 
169 } // namespace Kokkos
170 
171 //----------------------------------------------------------------------------
172 
173 namespace Kokkos {
174 
175 namespace Impl {
176 
177 template<>
178 class SharedAllocationRecord< Kokkos::Experimental::HBWSpace, void >
179  : public SharedAllocationRecord< void, void >
180 {
181 private:
182 
183  friend Kokkos::Experimental::HBWSpace;
184 
185  typedef SharedAllocationRecord< void, void > RecordBase;
186 
187  SharedAllocationRecord( const SharedAllocationRecord & ) = delete;
188  SharedAllocationRecord & operator = ( const SharedAllocationRecord & ) = delete;
189 
190  static void deallocate( RecordBase * );
191 
193  static RecordBase s_root_record;
194 
195  const Kokkos::Experimental::HBWSpace m_space;
196 
197 protected:
198 
199  ~SharedAllocationRecord();
200  SharedAllocationRecord() = default;
201 
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
206  );
207 
208 public:
209 
210  inline
211  std::string get_label() const
212  {
213  return std::string( RecordBase::head()->m_label );
214  }
215 
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
220  )
221  {
222 #if defined( KOKKOS_ACTIVE_EXECUTION_MEMORY_SPACE_HOST )
223  return new SharedAllocationRecord( arg_space, arg_label, arg_alloc_size );
224 #else
225  return (SharedAllocationRecord *) 0;
226 #endif
227  }
228 
230  static
231  void * allocate_tracked( const Kokkos::Experimental::HBWSpace & arg_space
232  , const std::string & arg_label
233  , const size_t arg_alloc_size );
234 
236  static
237  void * reallocate_tracked( void * const arg_alloc_ptr
238  , const size_t arg_alloc_size );
239 
241  static
242  void deallocate_tracked( void * const arg_alloc_ptr );
243 
244  static SharedAllocationRecord * get_record( void * arg_alloc_ptr );
245 
246  static void print_records( std::ostream &, const Kokkos::Experimental::HBWSpace &, bool detail = false );
247 };
248 
249 } // namespace Impl
250 
251 } // namespace Kokkos
252 
253 //----------------------------------------------------------------------------
254 
255 namespace Kokkos {
256 
257 namespace Impl {
258 
260 
261 template<>
262 struct MemorySpaceAccess< Kokkos::HostSpace, Kokkos::Experimental::HBWSpace > {
263  enum { assignable = true };
264  enum { accessible = true };
265  enum { deepcopy = true };
266 };
267 
268 template<>
269 struct MemorySpaceAccess< Kokkos::Experimental::HBWSpace, Kokkos::HostSpace > {
270  enum { assignable = false };
271  enum { accessible = true };
272  enum { deepcopy = true };
273 };
274 
275 } // namespace Impl
276 
277 } // namespace Kokkos
278 
279 //----------------------------------------------------------------------------
280 
281 namespace Kokkos {
282 
283 namespace Impl {
284 
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 );
289  }
290 
291  DeepCopy( const ExecutionSpace& exec, void * dst, const void * src, size_t n ) {
292  exec.fence();
293  memcpy( dst, src, n );
294  }
295 };
296 
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 );
301  }
302 
303  DeepCopy( const ExecutionSpace& exec, void * dst, const void * src, size_t n ) {
304  exec.fence();
305  memcpy( dst, src, n );
306  }
307 };
308 
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 );
313  }
314 
315  DeepCopy( const ExecutionSpace& exec, void * dst, const void * src, size_t n ) {
316  exec.fence();
317  memcpy( dst, src, n );
318  }
319 };
320 
321 } // namespace Impl
322 
323 } // namespace Kokkos
324 
325 namespace Kokkos {
326 
327 namespace Impl {
328 
329 template<>
330 struct VerifyExecutionCanAccessMemorySpace< Kokkos::HostSpace, Kokkos::Experimental::HBWSpace >
331 {
332  enum { value = true };
333  inline static void verify( void ) { }
334  inline static void verify( const void * ) { }
335 };
336 
337 template<>
338 struct VerifyExecutionCanAccessMemorySpace< Kokkos::Experimental::HBWSpace, Kokkos::HostSpace >
339 {
340  enum { value = true };
341  inline static void verify( void ) { }
342  inline static void verify( const void * ) { }
343 };
344 
345 } // namespace Impl
346 
347 } // namespace Kokkos
348 
349 #endif
350 #endif // #define KOKKOS_HBWSPACE_HPP
351 
Memory space for main process and CPU execution spaces.
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.