20#ifndef KOKKOS_IMPL_PUBLIC_INCLUDE
21#include <Kokkos_Macros.hpp>
23 "Including non-public Kokkos header files is not allowed.");
25#ifndef KOKKOS_LAYOUT_HPP
26#define KOKKOS_LAYOUT_HPP
29#include <impl/Kokkos_Traits.hpp>
33enum { ARRAY_LAYOUT_MAX_RANK = 8 };
54 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
56 enum :
bool { is_extent_constructible =
true };
63 KOKKOS_INLINE_FUNCTION
64 explicit constexpr LayoutLeft(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
65 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
66 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
67 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
68 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
69 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
70 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
71 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
72 : dimension{N0, N1, N2, N3, N4, N5, N6, N7} {}
74 friend bool operator==(
const LayoutLeft& left,
const LayoutLeft& right) {
75 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
76 if (left.dimension[rank] != right.dimension[rank])
return false;
80 friend bool operator!=(
const LayoutLeft& left,
const LayoutLeft& right) {
81 return !(left == right);
103 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
105 enum :
bool { is_extent_constructible =
true };
112 KOKKOS_INLINE_FUNCTION
113 explicit constexpr LayoutRight(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
114 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
115 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
116 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
117 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
118 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
119 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
120 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
121 : dimension{N0, N1, N2, N3, N4, N5, N6, N7} {}
123 friend bool operator==(
const LayoutRight& left,
const LayoutRight& right) {
124 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
125 if (left.dimension[rank] != right.dimension[rank])
return false;
129 friend bool operator!=(
const LayoutRight& left,
const LayoutRight& right) {
130 return !(left == right);
142 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
143 size_t stride[ARRAY_LAYOUT_MAX_RANK];
145 enum :
bool { is_extent_constructible =
false };
159 template <
typename iTypeOrder,
typename iTypeDimen>
165 int check_input = ARRAY_LAYOUT_MAX_RANK < rank ? 0 :
int(1 << rank) - 1;
166 for (
int r = 0; r < ARRAY_LAYOUT_MAX_RANK; ++r) {
167 tmp.dimension[r] = KOKKOS_IMPL_CTOR_DEFAULT_ARG;
170 for (
int r = 0; r < rank; ++r) {
175 for (
int r = 0; r < rank; ++r) {
184 KOKKOS_INLINE_FUNCTION
186 size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S0 = 0,
187 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S1 = 0,
188 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S2 = 0,
189 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S3 = 0,
190 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S4 = 0,
191 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S5 = 0,
192 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S6 = 0,
193 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S7 = 0)
194 : dimension{N0, N1, N2, N3, N4, N5, N6, N7}, stride{
S0,
S1,
S2,
S3,
197 friend bool operator==(
const LayoutStride& left,
const LayoutStride& right) {
198 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
199 if (left.dimension[rank] != right.dimension[rank] ||
200 left.stride[rank] != right.stride[rank])
205 friend bool operator!=(
const LayoutStride& left,
const LayoutStride& right) {
206 return !(left == right);
223template <
typename LayoutTiledCheck,
class Enable =
void>
224struct is_layouttiled : std::false_type {};
226template <
typename LayoutTiledCheck>
227struct is_layouttiled<LayoutTiledCheck,
228 std::enable_if_t<LayoutTiledCheck::is_array_layout_tiled>>
236 Kokkos::Iterate OuterP, Kokkos::Iterate InnerP,
unsigned ArgN0,
237 unsigned ArgN1,
unsigned ArgN2 = 0,
unsigned ArgN3 = 0,
unsigned ArgN4 = 0,
238 unsigned ArgN5 = 0,
unsigned ArgN6 = 0,
unsigned ArgN7 = 0,
240 (Kokkos::Impl::is_integral_power_of_two(ArgN0) &&
241 Kokkos::Impl::is_integral_power_of_two(ArgN1) &&
242 (Kokkos::Impl::is_integral_power_of_two(ArgN2) || (ArgN2 == 0)) &&
243 (Kokkos::Impl::is_integral_power_of_two(ArgN3) || (ArgN3 == 0)) &&
244 (Kokkos::Impl::is_integral_power_of_two(ArgN4) || (ArgN4 == 0)) &&
245 (Kokkos::Impl::is_integral_power_of_two(ArgN5) || (ArgN5 == 0)) &&
246 (Kokkos::Impl::is_integral_power_of_two(ArgN6) || (ArgN6 == 0)) &&
247 (Kokkos::Impl::is_integral_power_of_two(ArgN7) || (ArgN7 == 0)))>
250 "LayoutTiled must be given power-of-two tile dimensions");
254 static constexpr Iterate outer_pattern =
OuterP;
255 static constexpr Iterate inner_pattern =
InnerP;
266 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
268 enum :
bool { is_extent_constructible =
true };
275 KOKKOS_INLINE_FUNCTION
283 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
284 if (
left.dimension[rank] !=
right.dimension[rank])
return false;
296template <
typename...
Layout>
297struct layout_iterate_type_selector {
298 static const Kokkos::Iterate outer_iteration_pattern =
299 Kokkos::Iterate::Default;
300 static const Kokkos::Iterate inner_iteration_pattern =
301 Kokkos::Iterate::Default;
305struct layout_iterate_type_selector<Kokkos::LayoutRight> {
306 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Right;
307 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Right;
311struct layout_iterate_type_selector<Kokkos::LayoutLeft> {
312 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Left;
313 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Left;
317struct layout_iterate_type_selector<Kokkos::LayoutStride> {
318 static const Kokkos::Iterate outer_iteration_pattern =
319 Kokkos::Iterate::Default;
320 static const Kokkos::Iterate inner_iteration_pattern =
321 Kokkos::Iterate::Default;
324template <
unsigned ArgN0,
unsigned ArgN1,
unsigned ArgN2,
unsigned ArgN3,
325 unsigned ArgN4,
unsigned ArgN5,
unsigned ArgN6,
unsigned ArgN7>
326struct layout_iterate_type_selector<Kokkos::Experimental::LayoutTiled<
327 Kokkos::Iterate::Left, Kokkos::Iterate::Left, ArgN0, ArgN1, ArgN2, ArgN3,
328 ArgN4, ArgN5, ArgN6, ArgN7, true>> {
329 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Left;
330 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Left;
333template <
unsigned ArgN0,
unsigned ArgN1,
unsigned ArgN2,
unsigned ArgN3,
334 unsigned ArgN4,
unsigned ArgN5,
unsigned ArgN6,
unsigned ArgN7>
335struct layout_iterate_type_selector<Kokkos::Experimental::LayoutTiled<
336 Kokkos::Iterate::Right, Kokkos::Iterate::Left, ArgN0, ArgN1, ArgN2, ArgN3,
337 ArgN4, ArgN5, ArgN6, ArgN7, true>> {
338 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Right;
339 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Left;
342template <
unsigned ArgN0,
unsigned ArgN1,
unsigned ArgN2,
unsigned ArgN3,
343 unsigned ArgN4,
unsigned ArgN5,
unsigned ArgN6,
unsigned ArgN7>
344struct layout_iterate_type_selector<Kokkos::Experimental::LayoutTiled<
345 Kokkos::Iterate::Left, Kokkos::Iterate::Right, ArgN0, ArgN1, ArgN2, ArgN3,
346 ArgN4, ArgN5, ArgN6, ArgN7, true>> {
347 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Left;
348 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Right;
351template <
unsigned ArgN0,
unsigned ArgN1,
unsigned ArgN2,
unsigned ArgN3,
352 unsigned ArgN4,
unsigned ArgN5,
unsigned ArgN6,
unsigned ArgN7>
353struct layout_iterate_type_selector<Kokkos::Experimental::LayoutTiled<
354 Kokkos::Iterate::Right, Kokkos::Iterate::Right, ArgN0, ArgN1, ArgN2, ArgN3,
355 ArgN4, ArgN5, ArgN6, ArgN7, true>> {
356 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Right;
357 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Right;
A thread safe view to a bitset.
Memory layout tag indicating left-to-right (Fortran scheme) striding of multi-indices.
Memory layout tag indicating right-to-left (C or lexigraphical scheme) striding of multi-indices.
Memory layout tag indicated arbitrarily strided multi-index mapping into contiguous memory.
static KOKKOS_INLINE_FUNCTION LayoutStride order_dimensions(int const rank, iTypeOrder const *const order, iTypeDimen const *const dimen)
Compute strides from ordered dimensions.