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 ;
82 namespace Experimental {
83 struct WorkItemProperty {
84 template<
unsigned long Property>
85 struct ImplWorkItemProperty {
86 static const unsigned value = Property;
87 using work_item_property = ImplWorkItemProperty<Property>;
90 constexpr
static const ImplWorkItemProperty<0>
None = ImplWorkItemProperty<0>();
91 constexpr
static const ImplWorkItemProperty<1> HintLightWeight = ImplWorkItemProperty<1>();
92 constexpr
static const ImplWorkItemProperty<2> HintHeavyWeight = ImplWorkItemProperty<2>();
93 constexpr
static const ImplWorkItemProperty<4> HintRegular = ImplWorkItemProperty<4>();
94 constexpr
static const ImplWorkItemProperty<8> HintIrregular = ImplWorkItemProperty<8>();
95 typedef ImplWorkItemProperty<0> None_t;
96 typedef ImplWorkItemProperty<1> HintLightWeight_t;
97 typedef ImplWorkItemProperty<2> HintHeavyWeight_t;
98 typedef ImplWorkItemProperty<4> HintRegular_t;
99 typedef ImplWorkItemProperty<8> HintIrregular_t;
102 template<
unsigned long pv1,
unsigned long pv2>
103 inline constexpr WorkItemProperty::ImplWorkItemProperty<pv1|pv2>
operator |
104 (WorkItemProperty::ImplWorkItemProperty<pv1>, WorkItemProperty::ImplWorkItemProperty<pv2>) {
105 return WorkItemProperty::ImplWorkItemProperty<pv1|pv2>();
108 template<
unsigned long pv1,
unsigned long pv2>
109 inline constexpr WorkItemProperty::ImplWorkItemProperty<pv1&pv2>
operator &
110 (WorkItemProperty::ImplWorkItemProperty<pv1>, WorkItemProperty::ImplWorkItemProperty<pv2>) {
111 return WorkItemProperty::ImplWorkItemProperty<pv1&pv2>();
114 template<
unsigned long pv1,
unsigned long pv2>
115 inline constexpr
bool operator == (WorkItemProperty::ImplWorkItemProperty<pv1>, WorkItemProperty::ImplWorkItemProperty<pv2>) {
125 template<
unsigned int maxT = 0
126 ,
unsigned int minB = 0
132 static unsigned int constexpr maxTperB {maxT};
133 static unsigned int constexpr minBperSM {minB};
143 #define KOKKOS_IMPL_IS_CONCEPT( CONCEPT ) \
144 template< typename T > struct is_ ## CONCEPT { \
146 template< typename , typename = std::true_type > struct have : std::false_type {}; \
147 template< typename U > struct have<U,typename std::is_base_of< \
148 typename std::remove_cv<typename U:: CONCEPT>::type, \
149 typename std::remove_cv<U>::type \
150 >::type> : std::true_type {}; \
151 template< typename U > struct have<U,typename std::is_base_of< \
152 typename std::remove_cv<typename U:: CONCEPT ## _type>::type, \
153 typename std::remove_cv<U>::type \
154 >::type> : std::true_type {}; \
156 enum { value = is_ ## CONCEPT::template have<T>::value }; \
161 KOKKOS_IMPL_IS_CONCEPT( memory_space )
162 KOKKOS_IMPL_IS_CONCEPT( memory_traits )
163 KOKKOS_IMPL_IS_CONCEPT( execution_space )
164 KOKKOS_IMPL_IS_CONCEPT( execution_policy )
165 KOKKOS_IMPL_IS_CONCEPT( array_layout )
166 KOKKOS_IMPL_IS_CONCEPT( reducer )
167 namespace Experimental {
168 KOKKOS_IMPL_IS_CONCEPT( work_item_property )
175 using Kokkos::is_memory_space ;
176 using Kokkos::is_memory_traits ;
177 using Kokkos::is_execution_space ;
178 using Kokkos::is_execution_policy ;
179 using Kokkos::is_array_layout ;
183 KOKKOS_IMPL_IS_CONCEPT( iteration_pattern )
184 KOKKOS_IMPL_IS_CONCEPT( schedule_type )
185 KOKKOS_IMPL_IS_CONCEPT( index_type )
186 KOKKOS_IMPL_IS_CONCEPT( launch_bounds )
187 KOKKOS_IMPL_IS_CONCEPT( thread_team_member )
188 KOKKOS_IMPL_IS_CONCEPT( host_thread_team_member )
192 #undef KOKKOS_IMPL_IS_CONCEPT
200 template<
class ExecutionSpace ,
class MemorySpace >
202 static_assert( Kokkos::is_execution_space<ExecutionSpace>::value
203 ,
"Execution space is not valid" );
204 static_assert( Kokkos::is_memory_space<MemorySpace>::value
205 ,
"Memory space is not valid" );
206 typedef ExecutionSpace execution_space;
207 typedef MemorySpace memory_space;
208 typedef Device<execution_space,memory_space> device_type;
212 template<
typename T >
216 template<
typename ,
typename =
void >
217 struct exe : std::false_type {
typedef void space ; };
219 template<
typename ,
typename =
void >
220 struct mem : std::false_type {
typedef void space ; };
222 template<
typename ,
typename =
void >
223 struct dev : std::false_type {
typedef void space ; };
225 template<
typename U >
226 struct exe<U,typename std::conditional<true,void,typename U::execution_space>::type>
227 : std::is_same<U,typename U::execution_space>::type
228 {
typedef typename U::execution_space space ; };
230 template<
typename U >
231 struct mem<U,typename std::conditional<true,void,typename U::memory_space>::type>
232 : std::is_same<U,typename U::memory_space>::type
233 {
typedef typename U::memory_space space ; };
235 template<
typename U >
236 struct dev<U,typename std::conditional<true,void,typename U::device_type>::type>
237 : std::is_same<U,typename U::device_type>::type
238 {
typedef typename U::device_type space ; };
240 typedef typename is_space::template exe<T> is_exe ;
241 typedef typename is_space::template mem<T> is_mem ;
242 typedef typename is_space::template dev<T> is_dev ;
246 enum { value = is_exe::value || is_mem::value || is_dev::value };
248 typedef typename is_exe::space execution_space ;
249 typedef typename is_mem::space memory_space ;
254 typedef typename std::conditional
255 < std::is_same< memory_space , Kokkos::HostSpace >::value
256 #if defined( KOKKOS_ENABLE_CUDA )
257 || std::is_same< memory_space , Kokkos::CudaUVMSpace >::value
258 || std::is_same< memory_space , Kokkos::CudaHostPinnedSpace >::value
262 >::type host_memory_space ;
264 #if defined( KOKKOS_ENABLE_CUDA )
265 typedef typename std::conditional
266 < std::is_same< execution_space , Kokkos::Cuda >::value
267 , Kokkos::DefaultHostExecutionSpace , execution_space
268 >::type host_execution_space ;
270 #if defined( KOKKOS_ENABLE_OPENMPTARGET )
271 typedef typename std::conditional
272 < std::is_same< execution_space , Kokkos::Experimental::OpenMPTarget >::value
273 , Kokkos::DefaultHostExecutionSpace , execution_space
274 >::type host_execution_space ;
276 typedef execution_space host_execution_space ;
280 typedef typename std::conditional
281 < std::is_same< execution_space , host_execution_space >::value &&
282 std::is_same< memory_space , host_memory_space >::value
283 , T , Kokkos::Device< host_execution_space , host_memory_space >
284 >::type host_mirror_space ;
291 using Kokkos::is_space ;
307 template<
typename DstMemorySpace ,
typename SrcMemorySpace >
310 static_assert( Kokkos::is_memory_space< DstMemorySpace >::value &&
311 Kokkos::is_memory_space< SrcMemorySpace >::value
312 ,
"template arguments must be memory spaces" );
321 enum { assignable = std::is_same<DstMemorySpace,SrcMemorySpace>::value };
326 enum { accessible = assignable };
331 enum { deepcopy = assignable };
357 template<
typename AccessSpace ,
typename MemorySpace >
361 static_assert( Kokkos::is_space< AccessSpace >::value
362 ,
"template argument #1 must be a Kokkos space" );
364 static_assert( Kokkos::is_memory_space< MemorySpace >::value
365 ,
"template argument #2 must be a Kokkos memory space" );
370 <
typename AccessSpace::execution_space::memory_space
371 ,
typename AccessSpace::memory_space
373 ,
"template argument #1 is an invalid space" );
376 <
typename AccessSpace::execution_space::memory_space , MemorySpace >
380 <
typename AccessSpace::memory_space , MemorySpace >
390 enum { accessible = exe_access::accessible };
398 is_memory_space< AccessSpace >::value && mem_access::assignable };
401 enum { deepcopy = mem_access::deepcopy };
407 typedef typename std::conditional
408 < std::is_same<typename AccessSpace::memory_space,MemorySpace>::value ||
409 ! exe_access::accessible
411 , Kokkos::Device< typename AccessSpace::execution_space , MemorySpace >
426 #endif // KOKKOS_CORE_CONCEPTS_HPP
KOKKOS_INLINE_FUNCTION bool operator==(const complex< RealType1 > &x, const complex< RealType2 > &y)
Equality operator for two complex numbers.
Can AccessSpace access MemorySpace ?
Memory management for host memory.
Specify Launch Bounds for CUDA execution.
Access relationship between DstMemorySpace and SrcMemorySpace.