47 #ifndef KOKKOS_LAYOUT_HPP 48 #define KOKKOS_LAYOUT_HPP 51 #include <impl/Kokkos_Traits.hpp> 52 #include <impl/Kokkos_Tags.hpp> 56 enum { ARRAY_LAYOUT_MAX_RANK = 8 };
77 size_t dimension[ ARRAY_LAYOUT_MAX_RANK ];
84 KOKKOS_INLINE_FUNCTION
86 LayoutLeft(
size_t N0 = 0 ,
size_t N1 = 0 ,
size_t N2 = 0 ,
size_t N3 = 0
87 ,
size_t N4 = 0 ,
size_t N5 = 0 ,
size_t N6 = 0 ,
size_t N7 = 0 )
88 : dimension { N0 , N1 , N2 , N3 , N4 , N5 , N6 , N7 } {}
109 size_t dimension[ ARRAY_LAYOUT_MAX_RANK ];
116 KOKKOS_INLINE_FUNCTION
118 LayoutRight(
size_t N0 = 0 ,
size_t N1 = 0 ,
size_t N2 = 0 ,
size_t N3 = 0
119 ,
size_t N4 = 0 ,
size_t N5 = 0 ,
size_t N6 = 0 ,
size_t N7 = 0 )
120 : dimension { N0 , N1 , N2 , N3 , N4 , N5 , N6 , N7 } {}
132 size_t dimension[ ARRAY_LAYOUT_MAX_RANK ] ;
133 size_t stride[ ARRAY_LAYOUT_MAX_RANK ] ;
147 template<
typename iTypeOrder ,
typename iTypeDimen >
148 KOKKOS_INLINE_FUNCTION
static 150 , iTypeOrder
const *
const order
151 , iTypeDimen
const *
const dimen )
155 int check_input = ARRAY_LAYOUT_MAX_RANK <
rank ? 0 : int( 1 <<
rank ) - 1 ;
156 for (
int r = 0 ; r < ARRAY_LAYOUT_MAX_RANK ; ++r ) {
157 tmp.dimension[r] = 0 ;
159 check_input &= ~int( 1 << order[r] );
161 if ( 0 == check_input ) {
163 for (
int r = 0 ; r <
rank ; ++r ) {
164 tmp.stride[ order[r] ] = n ;
165 n *= ( dimen[order[r]] );
166 tmp.dimension[r] = dimen[r];
172 KOKKOS_INLINE_FUNCTION
175 ,
size_t N1 = 0 ,
size_t S1 = 0
176 ,
size_t N2 = 0 ,
size_t S2 = 0
177 ,
size_t N3 = 0 ,
size_t S3 = 0
178 ,
size_t N4 = 0 ,
size_t S4 = 0
179 ,
size_t N5 = 0 ,
size_t S5 = 0
180 ,
size_t N6 = 0 ,
size_t S6 = 0
181 ,
size_t N7 = 0 ,
size_t S7 = 0
183 : dimension { N0 , N1 , N2 , N3 , N4 , N5 , N6 , N7 }
184 , stride { S0 , S1 , S2 , S3 , S4 , S5 , S6 , S7 }
205 template <
unsigned ArgN0 ,
unsigned ArgN1 ,
206 bool IsPowerOfTwo = ( Impl::is_integral_power_of_two(ArgN0) &&
207 Impl::is_integral_power_of_two(ArgN1) )
211 static_assert( Impl::is_integral_power_of_two(ArgN0) &&
212 Impl::is_integral_power_of_two(ArgN1)
213 ,
"LayoutTileLeft must be given power-of-two tile dimensions" );
221 size_t dimension[ ARRAY_LAYOUT_MAX_RANK ] ;
223 LayoutTileLeft( LayoutTileLeft
const & ) = default ;
224 LayoutTileLeft( LayoutTileLeft && ) = default ;
225 LayoutTileLeft & operator = ( LayoutTileLeft
const & ) = default ;
226 LayoutTileLeft & operator = ( LayoutTileLeft && ) = default ;
228 KOKKOS_INLINE_FUNCTION
230 LayoutTileLeft(
size_t argN0 = 0 ,
size_t argN1 = 0 ,
size_t argN2 = 0 ,
size_t argN3 = 0
231 ,
size_t argN4 = 0 ,
size_t argN5 = 0 ,
size_t argN6 = 0 ,
size_t argN7 = 0
233 : dimension { argN0 , argN1 , argN2 , argN3 , argN4 , argN5 , argN6 , argN7 } {}
238 #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.
KOKKOS_INLINE_FUNCTION constexpr unsigned rank(const View< D, P... > &V)
Temporary free function rank() until rank() is implemented in the View.