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.