44 #ifndef KOKKOS_CORE_CONCEPTS_HPP 45 #define KOKKOS_CORE_CONCEPTS_HPP 47 #include <type_traits> 50 #include <Kokkos_Core_fwd.hpp> 65 static_assert( std::is_same<T,Static>::value
66 || std::is_same<T,Dynamic>::value
67 ,
"Kokkos: Invalid Schedule<> type." 69 using schedule_type = Schedule ;
77 static_assert(std::is_integral<T>::value,
"Kokkos: Invalid IndexType<>.");
78 using index_type = IndexType ;
89 #define KOKKOS_IMPL_IS_CONCEPT( CONCEPT ) \ 90 template< typename T > struct is_ ## CONCEPT { \ 92 template< typename , typename = std::true_type > struct have : std::false_type {}; \ 93 template< typename U > struct have<U,typename std::is_same<U,typename U:: CONCEPT >::type> : std::true_type {}; \ 95 enum { value = is_ ## CONCEPT::template have<T>::value }; \ 100 KOKKOS_IMPL_IS_CONCEPT( memory_space )
101 KOKKOS_IMPL_IS_CONCEPT( memory_traits )
102 KOKKOS_IMPL_IS_CONCEPT( execution_space )
103 KOKKOS_IMPL_IS_CONCEPT( execution_policy )
104 KOKKOS_IMPL_IS_CONCEPT( array_layout )
110 using Kokkos::is_memory_space ;
111 using Kokkos::is_memory_traits ;
112 using Kokkos::is_execution_space ;
113 using Kokkos::is_execution_policy ;
114 using Kokkos::is_array_layout ;
118 KOKKOS_IMPL_IS_CONCEPT( iteration_pattern )
119 KOKKOS_IMPL_IS_CONCEPT( schedule_type )
120 KOKKOS_IMPL_IS_CONCEPT( index_type )
124 #undef KOKKOS_IMPL_IS_CONCEPT 132 template<
class ExecutionSpace ,
class MemorySpace >
134 static_assert( Kokkos::is_execution_space<ExecutionSpace>::value
135 ,
"Execution space is not valid" );
136 static_assert( Kokkos::is_memory_space<MemorySpace>::value
137 ,
"Memory space is not valid" );
138 typedef ExecutionSpace execution_space;
139 typedef MemorySpace memory_space;
144 template<
typename T >
148 template<
typename ,
typename =
void >
149 struct exe : std::false_type {
typedef void space ; };
151 template<
typename ,
typename =
void >
152 struct mem : std::false_type {
typedef void space ; };
154 template<
typename ,
typename =
void >
155 struct dev : std::false_type {
typedef void space ; };
157 template<
typename U >
158 struct exe<U,typename std::conditional<true,void,typename U::execution_space>::type>
159 : std::is_same<U,typename U::execution_space>::type
160 {
typedef typename U::execution_space space ; };
162 template<
typename U >
163 struct mem<U,typename std::conditional<true,void,typename U::memory_space>::type>
164 : std::is_same<U,typename U::memory_space>::type
165 {
typedef typename U::memory_space space ; };
167 template<
typename U >
168 struct dev<U,typename std::conditional<true,void,typename U::device_type>::type>
169 : std::is_same<U,typename U::device_type>::type
170 {
typedef typename U::device_type space ; };
172 typedef typename is_space::template exe<T> is_exe ;
173 typedef typename is_space::template mem<T> is_mem ;
174 typedef typename is_space::template dev<T> is_dev ;
178 enum { value = is_exe::value || is_mem::value || is_dev::value };
180 typedef typename is_exe::space execution_space ;
181 typedef typename is_mem::space memory_space ;
186 typedef typename std::conditional
187 < std::is_same< memory_space , Kokkos::HostSpace >::value
188 #if defined( KOKKOS_HAVE_CUDA ) 189 || std::is_same< memory_space , Kokkos::CudaUVMSpace >::value
190 || std::is_same< memory_space , Kokkos::CudaHostPinnedSpace >::value
194 >::type host_memory_space ;
196 #if defined( KOKKOS_HAVE_CUDA ) 197 typedef typename std::conditional
198 < std::is_same< execution_space , Kokkos::Cuda >::value
199 , Kokkos::DefaultHostExecutionSpace , execution_space
200 >::type host_execution_space ;
202 typedef execution_space host_execution_space ;
205 typedef typename std::conditional
206 < std::is_same< execution_space , host_execution_space >::value &&
207 std::is_same< memory_space , host_memory_space >::value
209 >::type host_mirror_space ;
216 using Kokkos::is_space ;
232 template<
typename DstMemorySpace ,
typename SrcMemorySpace >
235 static_assert( Kokkos::is_memory_space< DstMemorySpace >::value &&
236 Kokkos::is_memory_space< SrcMemorySpace >::value
237 ,
"template arguments must be memory spaces" );
246 enum { assignable = std::is_same<DstMemorySpace,SrcMemorySpace>::value };
251 enum { accessible = assignable };
256 enum { deepcopy = assignable };
279 template<
typename AccessSpace ,
typename MemorySpace >
283 static_assert( Kokkos::is_space< AccessSpace >::value
284 ,
"template argument #1 must be a Kokkos space" );
287 <
typename AccessSpace::execution_space::memory_space
288 ,
typename AccessSpace::memory_space >::value
289 ,
"template argument #1 is an invalid space" );
291 static_assert( Kokkos::is_memory_space< MemorySpace >::value
292 ,
"template argument #2 must be a Kokkos memory space" );
295 <
typename AccessSpace::execution_space::memory_space , MemorySpace >
299 <
typename AccessSpace::memory_space , MemorySpace >
309 enum { accessible = exe_access::accessible };
317 is_memory_space< AccessSpace >::value && mem_access::assignable };
320 enum { deepcopy = mem_access::deepcopy };
326 typedef typename std::conditional
327 < std::is_same<typename AccessSpace::memory_space,MemorySpace>::value ||
328 ! exe_access::accessible
338 #endif // KOKKOS_CORE_CONCEPTS_HPP Can AccessSpace access MemorySpace ?
Memory space for main process and CPU execution spaces.
Memory management for host memory.
Access relationship between DstMemorySpace and SrcMemorySpace.