21 #ifndef RAJA_util_static_layout_HPP
22 #define RAJA_util_static_layout_HPP
24 #include "RAJA/config.hpp"
43 template<
typename IdxLin,
47 typename DimTypeList =
void>
50 template<
typename IdxLin,
55 camp::int_seq<IdxLin, RangeInts...>,
56 camp::int_seq<IdxLin, Sizes...>,
57 camp::int_seq<IdxLin, Strides...>,
62 using sizes = camp::int_seq<IdxLin, Sizes...>;
63 using strides = camp::int_seq<IdxLin, Strides...>;
65 static constexpr camp::idx_t stride_one_dim = RAJA::max<camp::idx_t>(
66 (camp::seq_at<RangeInts, strides>::value == 1 ? camp::idx_t(RangeInts)
69 static constexpr
size_t n_dims =
sizeof...(Sizes);
78 camp::sink(printf(
"StaticLayout: arg%d: size=%d, stride=%d\n",
79 (
int)RangeInts, (
int)Sizes, (
int)Strides)...);
89 template<
typename... Indices>
91 Indices... indices)
const
94 return RAJA::sum<IdxLin>((IdxLin(indices * Strides))...);
97 template<
typename... Indices>
102 return RAJA::sum<IdxLin>((IdxLin(indices * Strides))...);
107 static constexpr IdxLin s_size =
108 RAJA::product<IdxLin>((Sizes == IdxLin(0) ? IdxLin(1) : Sizes)...);
111 static constexpr IdxLin s_size_noproj = RAJA::product<IdxLin>(Sizes...);
135 return s_size_noproj;
138 template<camp::
idx_t DIM>
141 return camp::seq_at<DIM, strides>::value;
144 template<camp::
idx_t DIM>
147 return camp::seq_at<DIM, sizes>::value;
150 template<camp::
idx_t DIM>
157 template<
typename IdxLin, IdxLin N, IdxLin Idx, IdxLin... Sizes>
160 static_assert(N ==
sizeof...(Sizes),
"");
163 static constexpr IdxLin
size = camp::seq_at<Idx, sizes_seq>::value;
172 template<
typename IdxLin, IdxLin N, IdxLin... Sizes>
175 static_assert(N ==
sizeof...(Sizes),
"");
177 static constexpr IdxLin
size = 1;
182 template<
typename IdxLin,
typename Range,
typename Perm,
typename Sizes>
185 template<
typename IdxLin, IdxLin... Range, camp::idx_t...
Perm, IdxLin... Sizes>
187 camp::int_seq<IdxLin, Range...>,
188 camp::idx_seq<Perm...>,
189 camp::int_seq<IdxLin, Sizes...>>
191 static_assert(
sizeof...(Sizes) ==
sizeof...(
Perm),
"");
193 using sizes = camp::int_seq<IdxLin, Sizes...>;
194 static constexpr IdxLin N =
sizeof...(Sizes);
195 using range = camp::int_seq<IdxLin, Range...>;
204 camp::seq_at<Perm, sizes>::value...>::stride...>;
207 camp::int_seq<IdxLin,
208 camp::seq_at<camp::seq_at<Range, inv_perm>::value,
212 template<
typename IdxLin,
216 typename... DimTypes>
218 camp::int_seq<IdxLin, RangeInts...>,
219 camp::int_seq<IdxLin, Sizes...>,
220 camp::int_seq<IdxLin, Strides...>,
221 camp::list<DimTypes...>>
226 using ranges = camp::int_seq<IdxLin, RangeInts...>;
227 using sizes = camp::int_seq<IdxLin, Sizes...>;
228 using strides = camp::int_seq<IdxLin, Strides...>;
233 static constexpr camp::idx_t stride_one_dim = InnerLayout::stride_one_dim;
251 static constexpr
IndexLinear s_size_noproj = InnerLayout::s_size_noproj;
260 return s_size_noproj;
263 template<camp::
idx_t DIM>
269 template<camp::
idx_t DIM>
272 return camp::seq_at<DIM, sizes>::value;
275 template<camp::
idx_t DIM>
282 static void print() { InnerLayout::print(); }
285 template<
typename Perm,
300 template<
typename Perm,
typename IdxLin, camp::idx_t... Sizes>
304 camp::int_seq<IdxLin, Sizes...>,
305 camp::make_int_seq_t<IdxLin,
sizeof...(Sizes)>,
308 template<
typename Perm, camp::idx_t... Sizes>
311 template<
typename Perm,
314 camp::idx_t... Sizes>
318 camp::int_seq<IdxLin, Sizes...>,
319 camp::make_int_seq_t<IdxLin,
sizeof...(Sizes)>,
RAJA header file for strongly-typed integer class.
Header file for RAJA operator definitions.
RAJA header file defining permutations.
Header file with support for pre-C++14 compilers.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
Definition: AlignedRangeIndexSetBuilders.cpp:35
StaticLayoutT< Perm, camp::idx_t, Sizes... > StaticLayout
Definition: StaticLayout.hpp:309
constexpr RAJA_HOST_DEVICE RAJA_INLINE std::enable_if< std::is_base_of< IndexValueBase, FROM >::value, typename FROM::value_type >::type stripIndexType(FROM const val)
Function that strips the strongly typed Index<> and returns its underlying value_type value.
Definition: IndexValue.hpp:323
typename detail::StaticLayoutMaker< Perm, IdxLin, camp::int_seq< IdxLin, Sizes... >, camp::make_int_seq_t< IdxLin, sizeof...(Sizes)>, TypeList >::type TypedStaticLayout
Definition: StaticLayout.hpp:320
typename detail::StaticLayoutMaker< Perm, IdxLin, camp::int_seq< IdxLin, Sizes... >, camp::make_int_seq_t< IdxLin, sizeof...(Sizes)>, void >::type StaticLayoutT
Definition: StaticLayout.hpp:306
typename internal::InversePermutationHelper< camp::make_idx_seq_t< camp::size< Perm >::value >, Perm >::type invert_permutation
Definition: Permutations.hpp:241
camp::idx_seq< Ints... > Perm
Definition: PermutedLayout.hpp:101
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_size() const
Definition: StaticLayout.hpp:145
camp::int_seq< IdxLin, Sizes... > sizes
Definition: StaticLayout.hpp:62
RAJA_INLINE static constexpr RAJA_HOST_DEVICE IdxLin size_noproj()
Definition: StaticLayout.hpp:132
static RAJA_INLINE void print()
Definition: StaticLayout.hpp:76
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_begin() const
Definition: StaticLayout.hpp:151
camp::int_seq< IdxLin, Strides... > strides
Definition: StaticLayout.hpp:63
RAJA_INLINE constexpr RAJA_HOST_DEVICE StaticLayoutBase_impl()
Definition: StaticLayout.hpp:74
RAJA_INLINE static constexpr RAJA_HOST_DEVICE IdxLin size()
Definition: StaticLayout.hpp:119
IdxLin IndexLinear
Definition: StaticLayout.hpp:61
RAJA_INLINE constexpr RAJA_HOST_DEVICE IdxLin operator()(Indices... indices) const
Definition: StaticLayout.hpp:90
static RAJA_INLINE constexpr RAJA_HOST_DEVICE IdxLin s_oper(Indices... indices)
Definition: StaticLayout.hpp:98
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_stride() const
Definition: StaticLayout.hpp:139
camp::int_seq< IdxLin, RangeInts... > ranges
Definition: StaticLayout.hpp:226
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_begin() const
Definition: StaticLayout.hpp:276
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_stride() const
Definition: StaticLayout.hpp:264
RAJA_INLINE constexpr static RAJA_HOST_DEVICE IndexLinear size_noproj()
Definition: StaticLayout.hpp:258
camp::int_seq< IdxLin, Strides... > strides
Definition: StaticLayout.hpp:228
IdxLin IndexLinear
Definition: StaticLayout.hpp:225
camp::int_seq< IdxLin, Sizes... > sizes
Definition: StaticLayout.hpp:227
RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear get_dim_size() const
Definition: StaticLayout.hpp:270
RAJA_INLINE constexpr static RAJA_HOST_DEVICE IndexLinear size()
Definition: StaticLayout.hpp:253
static RAJA_INLINE void print()
Definition: StaticLayout.hpp:282
static RAJA_INLINE constexpr RAJA_HOST_DEVICE IndexLinear s_oper(DimTypes... indices)
Definition: StaticLayout.hpp:244
Definition: StaticLayout.hpp:48
Definition: StaticLayout.hpp:291
typename detail::StrideCalculator< IdxLin, Indexes, Perm, Sizes >::strides strides
Definition: StaticLayout.hpp:293
Definition: StaticLayout.hpp:159
static constexpr IdxLin size
Definition: StaticLayout.hpp:163
camp::int_seq< IdxLin, Sizes... > sizes_seq
Definition: StaticLayout.hpp:162
static constexpr IdxLin value
Definition: StaticLayout.hpp:166
static constexpr IdxLin stride
Definition: StaticLayout.hpp:169
static constexpr IdxLin size_last
Definition: StaticLayout.hpp:164
camp::int_seq< IdxLin, StrideCalculatorIdx< IdxLin, N, Range, camp::seq_at< Perm, sizes >::value... >::stride... > strides_unperm
Definition: StaticLayout.hpp:204
camp::int_seq< IdxLin, Sizes... > sizes
Definition: StaticLayout.hpp:193
camp::idx_seq< Perm... > perm
Definition: StaticLayout.hpp:196
camp::int_seq< IdxLin, camp::seq_at< camp::seq_at< Range, inv_perm >::value, strides_unperm >::value... > strides
Definition: StaticLayout.hpp:209
camp::int_seq< IdxLin, Range... > range
Definition: StaticLayout.hpp:195
invert_permutation< perm > inv_perm
Definition: StaticLayout.hpp:197
Definition: StaticLayout.hpp:183