RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
StaticLayout.hpp
Go to the documentation of this file.
1 
12 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
13 // Copyright (c) Lawrence Livermore National Security, LLC and other
14 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
15 // files for dates and other details. No copyright assignment is required
16 // to contribute to RAJA.
17 //
18 // SPDX-License-Identifier: (BSD-3-Clause)
19 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
20 
21 #ifndef RAJA_util_static_layout_HPP
22 #define RAJA_util_static_layout_HPP
23 
24 #include "RAJA/config.hpp"
25 
26 #include <iostream>
27 #include <limits>
28 
30 
31 #include "RAJA/internal/foldl.hpp"
32 
33 #include "RAJA/util/Operators.hpp"
35 
36 namespace RAJA
37 {
38 
39 namespace detail
40 {
41 
42 
43 template<typename IdxLin,
44  typename Range,
45  typename Sizes,
46  typename Strides,
47  typename DimTypeList = void>
49 
50 template<typename IdxLin,
51  IdxLin... RangeInts,
52  IdxLin... Sizes,
53  IdxLin... Strides>
54 struct StaticLayoutBase_impl<IdxLin,
55  camp::int_seq<IdxLin, RangeInts...>,
56  camp::int_seq<IdxLin, Sizes...>,
57  camp::int_seq<IdxLin, Strides...>,
58  void>
59 {
60 
61  using IndexLinear = IdxLin;
62  using sizes = camp::int_seq<IdxLin, Sizes...>;
63  using strides = camp::int_seq<IdxLin, Strides...>;
64 
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)
67  : -1)...);
68 
69  static constexpr size_t n_dims = sizeof...(Sizes);
70 
74  RAJA_INLINE RAJA_HOST_DEVICE constexpr StaticLayoutBase_impl() {}
75 
76  RAJA_INLINE static void print()
77  {
78  camp::sink(printf("StaticLayout: arg%d: size=%d, stride=%d\n",
79  (int)RangeInts, (int)Sizes, (int)Strides)...);
80  }
81 
89  template<typename... Indices>
90  RAJA_INLINE RAJA_HOST_DEVICE constexpr IdxLin operator()(
91  Indices... indices) const
92  {
93  // dot product of strides and indices
94  return RAJA::sum<IdxLin>((IdxLin(indices * Strides))...);
95  }
96 
97  template<typename... Indices>
98  static RAJA_INLINE RAJA_HOST_DEVICE constexpr IdxLin s_oper(
99  Indices... indices)
100  {
101  // dot product of strides and indices
102  return RAJA::sum<IdxLin>((IdxLin(indices * Strides))...);
103  }
104 
105  // Multiply together all of the sizes,
106  // replacing 1 for any zero-sized dimensions
107  static constexpr IdxLin s_size =
108  RAJA::product<IdxLin>((Sizes == IdxLin(0) ? IdxLin(1) : Sizes)...);
109 
110  // Multiply together all of the sizes
111  static constexpr IdxLin s_size_noproj = RAJA::product<IdxLin>(Sizes...);
112 
119  RAJA_INLINE RAJA_HOST_DEVICE static constexpr IdxLin size()
120  {
121  // Multiply together all of the sizes,
122  // replacing 1 for any zero-sized dimensions
123  return s_size;
124  }
125 
132  RAJA_INLINE RAJA_HOST_DEVICE static constexpr IdxLin size_noproj()
133  {
134  // Multiply together all of the sizes
135  return s_size_noproj;
136  }
137 
138  template<camp::idx_t DIM>
139  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_stride() const
140  {
141  return camp::seq_at<DIM, strides>::value;
142  }
143 
144  template<camp::idx_t DIM>
145  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_size() const
146  {
147  return camp::seq_at<DIM, sizes>::value;
148  }
149 
150  template<camp::idx_t DIM>
151  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_begin() const
152  {
153  return 0;
154  }
155 };
156 
157 template<typename IdxLin, IdxLin N, IdxLin Idx, IdxLin... Sizes>
159 {
160  static_assert(N == sizeof...(Sizes), "");
161 
162  using sizes_seq = camp::int_seq<IdxLin, Sizes...>;
163  static constexpr IdxLin size = camp::seq_at<Idx, sizes_seq>::value;
164  static constexpr IdxLin size_last =
165  StrideCalculatorIdx<IdxLin, N, Idx + 1, Sizes...>::size;
166  static constexpr IdxLin value =
167  (size_last > 0 ? size_last : 1) *
169  static constexpr IdxLin stride = size > 0 ? value : 0;
170 };
171 
172 template<typename IdxLin, IdxLin N, IdxLin... Sizes>
173 struct StrideCalculatorIdx<IdxLin, N, N, Sizes...>
174 {
175  static_assert(N == sizeof...(Sizes), "");
176 
177  static constexpr IdxLin size = 1;
178  static constexpr IdxLin value = 1;
179  static constexpr IdxLin stride = size > 0 ? value : 0;
180 };
181 
182 template<typename IdxLin, typename Range, typename Perm, typename Sizes>
184 
185 template<typename IdxLin, IdxLin... Range, camp::idx_t... Perm, IdxLin... Sizes>
186 struct StrideCalculator<IdxLin,
187  camp::int_seq<IdxLin, Range...>,
188  camp::idx_seq<Perm...>,
189  camp::int_seq<IdxLin, Sizes...>>
190 {
191  static_assert(sizeof...(Sizes) == sizeof...(Perm), "");
192 
193  using sizes = camp::int_seq<IdxLin, Sizes...>;
194  static constexpr IdxLin N = sizeof...(Sizes);
195  using range = camp::int_seq<IdxLin, Range...>;
196  using perm = camp::idx_seq<Perm...>;
198 
199  using strides_unperm = camp::int_seq<
200  IdxLin,
201  StrideCalculatorIdx<IdxLin,
202  N,
203  Range,
204  camp::seq_at<Perm, sizes>::value...>::stride...>;
205 
206  using strides =
207  camp::int_seq<IdxLin,
208  camp::seq_at<camp::seq_at<Range, inv_perm>::value,
209  strides_unperm>::value...>;
210 };
211 
212 template<typename IdxLin,
213  IdxLin... RangeInts,
214  IdxLin... Sizes,
215  IdxLin... Strides,
216  typename... DimTypes>
217 struct StaticLayoutBase_impl<IdxLin,
218  camp::int_seq<IdxLin, RangeInts...>,
219  camp::int_seq<IdxLin, Sizes...>,
220  camp::int_seq<IdxLin, Strides...>,
221  camp::list<DimTypes...>>
222 {
223 
224 
225  using IndexLinear = IdxLin;
226  using ranges = camp::int_seq<IdxLin, RangeInts...>;
227  using sizes = camp::int_seq<IdxLin, Sizes...>;
228  using strides = camp::int_seq<IdxLin, Strides...>;
229 
230  using InnerLayout =
232 
233  static constexpr camp::idx_t stride_one_dim = InnerLayout::stride_one_dim;
234 
235  static constexpr IndexLinear n_dims = sizeof...(DimTypes);
236 
244  static RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear s_oper(
245  DimTypes... indices)
246  {
247  return InnerLayout::s_oper(stripIndexType(indices)...);
248  }
249 
250  static constexpr IndexLinear s_size = InnerLayout::s_size;
251  static constexpr IndexLinear s_size_noproj = InnerLayout::s_size_noproj;
252 
253  RAJA_INLINE RAJA_HOST_DEVICE constexpr static IndexLinear size()
254  {
255  return s_size;
256  }
257 
258  RAJA_INLINE RAJA_HOST_DEVICE constexpr static IndexLinear size_noproj()
259  {
260  return s_size_noproj;
261  }
262 
263  template<camp::idx_t DIM>
264  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_stride() const
265  {
266  return InnerLayout {}.get_dim_stride();
267  }
268 
269  template<camp::idx_t DIM>
270  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_size() const
271  {
272  return camp::seq_at<DIM, sizes>::value;
273  }
274 
275  template<camp::idx_t DIM>
276  RAJA_INLINE RAJA_HOST_DEVICE constexpr IndexLinear get_dim_begin() const
277  {
278  return 0;
279  }
280 
281  RAJA_INLINE
282  static void print() { InnerLayout::print(); }
283 };
284 
285 template<typename Perm,
286  typename IdxLin,
287  typename Sizes,
288  typename Indexes,
289  typename TypeList>
291 {
292  using strides =
295 };
296 
297 
298 } // namespace detail
299 
300 template<typename Perm, typename IdxLin, camp::idx_t... Sizes>
302  Perm,
303  IdxLin,
304  camp::int_seq<IdxLin, Sizes...>,
305  camp::make_int_seq_t<IdxLin, sizeof...(Sizes)>,
306  void>::type;
307 
308 template<typename Perm, camp::idx_t... Sizes>
309 using StaticLayout = StaticLayoutT<Perm, camp::idx_t, Sizes...>;
310 
311 template<typename Perm,
312  typename IdxLin,
313  typename TypeList,
314  camp::idx_t... Sizes>
316  Perm,
317  IdxLin,
318  camp::int_seq<IdxLin, Sizes...>,
319  camp::make_int_seq_t<IdxLin, sizeof...(Sizes)>,
320  TypeList>::type;
321 
322 } // namespace RAJA
323 
324 #endif
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
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, camp::seq_at< camp::seq_at< Range, inv_perm >::value, strides_unperm >::value... > strides
Definition: StaticLayout.hpp:209
Definition: StaticLayout.hpp:183