47 #ifndef KOKKOS_LAYOUT_HPP 48 #define KOKKOS_LAYOUT_HPP 51 #include <impl/Kokkos_Traits.hpp> 52 #include <impl/Kokkos_Tags.hpp> 104 enum { MAX_RANK = 8 };
106 size_t dimension[ MAX_RANK ] ;
107 size_t stride[ MAX_RANK ] ;
116 template<
typename iTypeOrder ,
typename iTypeDimen >
117 KOKKOS_INLINE_FUNCTION
static 119 , iTypeOrder
const *
const order
120 , iTypeDimen
const *
const dimen )
124 int check_input = MAX_RANK < rank ? 0 : int( 1 << rank ) - 1 ;
125 for (
int r = 0 ; r < MAX_RANK ; ++r ) {
126 tmp.dimension[r] = 0 ;
128 check_input &= ~int( 1 << order[r] );
130 if ( 0 == check_input ) {
132 for (
int r = 0 ; r < rank ; ++r ) {
133 tmp.stride[ order[r] ] = n ;
134 n *= ( dimen[order[r]] );
135 tmp.dimension[r] = dimen[r];
159 template <
unsigned ArgN0 ,
unsigned ArgN1 ,
160 bool IsPowerOfTwo = ( Impl::is_integral_power_of_two(ArgN0) &&
161 Impl::is_integral_power_of_two(ArgN1) )
165 static_assert( Impl::is_integral_power_of_two(ArgN0) &&
166 Impl::is_integral_power_of_two(ArgN1)
167 ,
"LayoutTileLeft must be given power-of-two tile dimensions" );
178 #endif // #ifndef KOKKOS_LAYOUT_HPP LayoutLeft array_layout
Tag this class as a kokkos array layout.
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices.
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory...
LayoutStride array_layout
Tag this class as a kokkos array layout.
Memory layout tag indicating right-to-left (C or lexigraphical scheme) striding of multi-indices...
static KOKKOS_INLINE_FUNCTION LayoutStride order_dimensions(int const rank, iTypeOrder const *const order, iTypeDimen const *const dimen)
Compute strides from ordered dimensions.
LayoutTileLeft< ArgN0, ArgN1, IsPowerOfTwo > array_layout
Tag this class as a kokkos array layout.
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices by tiles...
LayoutRight array_layout
Tag this class as a kokkos array layout.