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>
33 enum { ARRAY_LAYOUT_MAX_RANK = 8 };
54 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
60 enum :
bool { is_extent_constructible =
true };
67 KOKKOS_INLINE_FUNCTION
68 explicit constexpr
LayoutLeft(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
69 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
70 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
71 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
72 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
73 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
74 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
75 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
76 : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
77 stride(KOKKOS_IMPL_CTOR_DEFAULT_ARG) {}
79 friend bool operator==(
const LayoutLeft& left,
const LayoutLeft& right) {
80 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
81 if (left.dimension[rank] != right.dimension[rank])
return false;
85 friend bool operator!=(
const LayoutLeft& left,
const LayoutLeft& right) {
86 return !(left == right);
108 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
114 enum :
bool { is_extent_constructible =
true };
121 KOKKOS_INLINE_FUNCTION
122 explicit constexpr
LayoutRight(
size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
123 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
124 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
125 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
126 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
127 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
128 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
129 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG)
130 : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
131 stride{KOKKOS_IMPL_CTOR_DEFAULT_ARG} {}
133 friend bool operator==(
const LayoutRight& left,
const LayoutRight& right) {
134 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
135 if (left.dimension[rank] != right.dimension[rank])
return false;
139 friend bool operator!=(
const LayoutRight& left,
const LayoutRight& right) {
140 return !(left == right);
152 size_t dimension[ARRAY_LAYOUT_MAX_RANK];
153 size_t stride[ARRAY_LAYOUT_MAX_RANK];
155 enum :
bool { is_extent_constructible =
false };
169 template <
typename iTypeOrder,
typename iTypeDimen>
171 int const rank, iTypeOrder
const*
const order,
172 iTypeDimen
const*
const dimen) {
175 int check_input = ARRAY_LAYOUT_MAX_RANK < rank ? 0 : int(1 << rank) - 1;
176 for (
int r = 0; r < ARRAY_LAYOUT_MAX_RANK; ++r) {
177 tmp.dimension[r] = KOKKOS_IMPL_CTOR_DEFAULT_ARG;
180 for (
int r = 0; r < rank; ++r) {
181 check_input &= ~int(1 << order[r]);
183 if (0 == check_input) {
185 for (
int r = 0; r < rank; ++r) {
186 tmp.stride[order[r]] = n;
187 n *= (dimen[order[r]]);
188 tmp.dimension[r] = dimen[r];
194 KOKKOS_INLINE_FUNCTION
196 size_t N0 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S0 = 0,
197 size_t N1 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S1 = 0,
198 size_t N2 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S2 = 0,
199 size_t N3 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S3 = 0,
200 size_t N4 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S4 = 0,
201 size_t N5 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S5 = 0,
202 size_t N6 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S6 = 0,
203 size_t N7 = KOKKOS_IMPL_CTOR_DEFAULT_ARG,
size_t S7 = 0)
204 : dimension{N0, N1, N2, N3, N4, N5, N6, N7},
205 stride{S0, S1, S2, S3, S4, S5, S6, S7} {}
207 friend bool operator==(
const LayoutStride& left,
const LayoutStride& right) {
208 for (
unsigned int rank = 0; rank < ARRAY_LAYOUT_MAX_RANK; ++rank)
209 if (left.dimension[rank] != right.dimension[rank] ||
210 left.stride[rank] != right.stride[rank])
215 friend bool operator!=(
const LayoutStride& left,
const LayoutStride& right) {
216 return !(left == right);
230 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
231 template <
typename Layout,
class Enable =
void>
232 struct KOKKOS_DEPRECATED is_layouttiled : std::false_type {};
237 template <
typename... Layout>
238 struct layout_iterate_type_selector {
239 static const Kokkos::Iterate outer_iteration_pattern =
240 Kokkos::Iterate::Default;
241 static const Kokkos::Iterate inner_iteration_pattern =
242 Kokkos::Iterate::Default;
246 struct layout_iterate_type_selector<Kokkos::LayoutRight> {
247 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Right;
248 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Right;
252 struct layout_iterate_type_selector<Kokkos::LayoutLeft> {
253 static const Kokkos::Iterate outer_iteration_pattern = Kokkos::Iterate::Left;
254 static const Kokkos::Iterate inner_iteration_pattern = Kokkos::Iterate::Left;
258 struct layout_iterate_type_selector<Kokkos::LayoutStride> {
259 static const Kokkos::Iterate outer_iteration_pattern =
260 Kokkos::Iterate::Default;
261 static const Kokkos::Iterate inner_iteration_pattern =
262 Kokkos::Iterate::Default;
266 #ifdef KOKKOS_ENABLE_DEPRECATED_CODE_4
267 template <
typename... Layout>
268 using layout_iterate_type_selector KOKKOS_DEPRECATED =
269 Impl::layout_iterate_type_selector<Layout...>;
274 #endif // #ifndef KOKKOS_LAYOUT_HPP
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...
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.