RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
TensorRef.hpp
Go to the documentation of this file.
1 
11 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
12 // Copyright (c) Lawrence Livermore National Security, LLC and other
13 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
14 // files for dates and other details. No copyright assignment is required
15 // to contribute to RAJA.
16 //
17 // SPDX-License-Identifier: (BSD-3-Clause)
18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
19 
20 #ifndef RAJA_pattern_tensor_tensorref_HPP
21 #define RAJA_pattern_tensor_tensorref_HPP
22 
23 #include "RAJA/config.hpp"
24 
25 #include "RAJA/util/macros.hpp"
26 
27 namespace RAJA
28 {
29 namespace internal
30 {
31 namespace expt
32 {
33 
34 template<typename INT_SEQ>
36 
37 template<typename INDEX_TYPE, INDEX_TYPE NEW_HEAD, typename ARRAY>
39 
40 template<typename INDEX_TYPE, size_t IDX, INDEX_TYPE DELTA, typename ARRAY>
42 
43 template<typename INDEX_TYPE, size_t IDX, INDEX_TYPE DELTA, typename ARRAY>
45 
46 template<typename INDEX_TYPE, INDEX_TYPE HEAD, INDEX_TYPE... TAIL>
47 struct StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>
48 {
49 
50  using seq_type = camp::int_seq<INDEX_TYPE, HEAD, TAIL...>;
51  using Self = StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>;
52  using Tail = StaticIndexArray<camp::int_seq<INDEX_TYPE, TAIL...>>;
53 
55 
56  RAJA_INLINE
57  StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>() = default;
58 
59 
61 
62  RAJA_INLINE
63  static constexpr INDEX_TYPE value_at(size_t index)
64  {
65  if (index == 0)
66  {
67  return HEAD;
68  }
69  else
70  {
71  return Tail::value_at(index - 1);
72  }
73  }
74 
76 
77  RAJA_INLINE
78  constexpr INDEX_TYPE operator[](size_t index) const
79  {
80  if (index == 0)
81  {
82  return HEAD;
83  }
84  else
85  {
86  return tail[index - 1];
87  }
88  }
89 
91 
92  RAJA_INLINE
93  void print_values() const
94  {
95  printf("%ld ", (long)HEAD);
96  tail.print_values();
97  }
98 
100 
101  RAJA_INLINE
102  void print() const
103  {
104  printf("[");
105  print_values();
106  printf("]");
107  }
108 };
109 
110 template<typename INDEX_TYPE>
111 struct StaticIndexArray<camp::int_seq<INDEX_TYPE>>
112 {
113 
114  using seq_type = camp::int_seq<INDEX_TYPE>;
115 
116  RAJA_INLINE
118 
119 
121 
122  RAJA_INLINE
123  static constexpr INDEX_TYPE value_at(size_t) { return 0; }
124 
126 
127  RAJA_INLINE
128  constexpr INDEX_TYPE operator[](size_t) const { return 0; }
129 
131 
132  RAJA_INLINE
133  void print_values() const {}
134 
136 
137  RAJA_INLINE
138  void print() const { print("[]"); }
139 };
140 
141 template<typename INDEX_TYPE, INDEX_TYPE NEW_HEAD, INDEX_TYPE... ORIG_INTS>
143  INDEX_TYPE,
144  NEW_HEAD,
145  StaticIndexArray<camp::int_seq<INDEX_TYPE, ORIG_INTS...>>>
146 {
147  using Type =
148  StaticIndexArray<camp::int_seq<INDEX_TYPE, NEW_HEAD, ORIG_INTS...>>;
149  using Seq = camp::int_seq<INDEX_TYPE, NEW_HEAD, ORIG_INTS...>;
150 };
151 
152 template<typename INDEX_TYPE,
153  size_t IDX,
154  INDEX_TYPE DELTA,
155  INDEX_TYPE HEAD,
156  INDEX_TYPE... TAIL>
158  INDEX_TYPE,
159  IDX,
160  DELTA,
161  StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>>
162 {
163  using Orig = StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>;
164  using AddTail = typename AddStaticIndexArray<INDEX_TYPE,
165  IDX - 1,
166  DELTA,
167  typename Orig::Tail>::Type;
168  using Type =
171 };
172 
173 template<typename INDEX_TYPE,
174  INDEX_TYPE DELTA,
175  INDEX_TYPE HEAD,
176  INDEX_TYPE... TAIL>
178  INDEX_TYPE,
179  0,
180  DELTA,
181  StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>>
182 {
183 
184  using Orig = StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>;
185  using Type = typename PrependStaticIndexArray<INDEX_TYPE,
186  HEAD + DELTA,
187  typename Orig::Tail>::Type;
188  using Seq = typename PrependStaticIndexArray<INDEX_TYPE,
189  HEAD + DELTA,
190  typename Orig::Tail>::Seq;
191 };
192 
193 template<typename INDEX_TYPE,
194  size_t IDX,
195  INDEX_TYPE VALUE,
196  INDEX_TYPE HEAD,
197  INDEX_TYPE... TAIL>
199  INDEX_TYPE,
200  IDX,
201  VALUE,
202  StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>>
203 {
204  using Orig = StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>;
205  using SetTail = typename SetStaticIndexArray<INDEX_TYPE,
206  IDX - 1,
207  VALUE,
208  typename Orig::Tail>::Type;
209  using Type =
212 };
213 
214 template<typename INDEX_TYPE,
215  INDEX_TYPE VALUE,
216  INDEX_TYPE HEAD,
217  INDEX_TYPE... TAIL>
219  INDEX_TYPE,
220  0,
221  VALUE,
222  StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>>
223 {
224  using Orig = StaticIndexArray<camp::int_seq<INDEX_TYPE, HEAD, TAIL...>>;
225  using Type = typename PrependStaticIndexArray<INDEX_TYPE,
226  VALUE,
227  typename Orig::Tail>::Type;
228  using Seq = typename PrependStaticIndexArray<INDEX_TYPE,
229  VALUE,
230  typename Orig::Tail>::Seq;
231 };
232 
234 {
235  TENSOR_PARTIAL, // the tile is a full TensorRegister
236  TENSOR_FULL, // the tile is a partial TensorRegister
237  TENSOR_MULTIPLE // the tile is multiple TennsorRegisters
238 };
239 
240 template<typename INDEX_TYPE, TensorTileSize TENSOR_SIZE, camp::idx_t NUM_DIMS>
242 {
245  using index_type = INDEX_TYPE;
246  index_type m_begin[NUM_DIMS];
247  index_type m_size[NUM_DIMS];
248 
249  static constexpr camp::idx_t s_num_dims = NUM_DIMS;
250  static constexpr TensorTileSize s_tensor_size = TENSOR_SIZE;
251 
252  template<typename I, TensorTileSize S>
254  {
255  for (camp::idx_t i = 0; i < NUM_DIMS; ++i)
256  {
257  m_begin[i] = c.m_begin[i];
258  m_size[i] = c.m_size[i];
259  }
260  }
261 
269  template<typename INDEX_TYPE2, TensorTileSize TENSOR_SIZE2>
270  RAJA_HOST_DEVICE RAJA_INLINE self_type
272  {
273  self_type result(*this);
274  for (camp::idx_t i = 0; i < s_num_dims; ++i)
275  {
276  result.m_begin[i] -= sub.m_begin[i];
277  }
278  return result;
279  }
280 
282 
283  RAJA_INLINE
284  void print() const
285  {
286  printf("TensorTile: dims=%d, m_begin=[", (int)NUM_DIMS);
287 
288  for (camp::idx_t i = 0; i < NUM_DIMS; ++i)
289  {
290  printf("%ld ", (long)m_begin[i]);
291  }
292 
293  printf("], m_size=[");
294 
295  for (camp::idx_t i = 0; i < NUM_DIMS; ++i)
296  {
297  printf("%ld ", (long)m_size[i]);
298  }
299 
300  printf("]\n");
301  }
302 };
303 
304 
305 template<typename INDEX_TYPE,
306  TensorTileSize TENSOR_SIZE,
307  typename TBEGIN,
308  typename TSIZE>
310 
311 template<typename INDEX_TYPE,
312  TensorTileSize TENSOR_SIZE,
313  INDEX_TYPE... BeginInts,
314  INDEX_TYPE... SizeInts>
315 struct StaticTensorTile<INDEX_TYPE,
316  TENSOR_SIZE,
317  camp::int_seq<INDEX_TYPE, BeginInts...>,
318  camp::int_seq<INDEX_TYPE, SizeInts...>>
319 {
320 
321 
322  using begin_seq = camp::int_seq<INDEX_TYPE, BeginInts...>;
323  using size_seq = camp::int_seq<INDEX_TYPE, SizeInts...>;
326  using self_type =
328  using index_type = INDEX_TYPE;
329 
331  TensorTile<INDEX_TYPE, TENSOR_SIZE, sizeof...(BeginInts)>;
332 
333  using Partial =
336 
339 
340  static_assert(sizeof...(BeginInts) == sizeof...(SizeInts),
341  "Mismatch between number of elements in Begin and Size series "
342  "of StaticTensorTile");
343 
344  static constexpr camp::idx_t s_num_dims = sizeof...(BeginInts);
345  static constexpr TensorTileSize s_tensor_size = TENSOR_SIZE;
346 
347  constexpr operator nonstatic_self_type() const
348  {
349  return nonstatic_self_type {{BeginInts...}, {SizeInts...}};
350  }
351 
352  constexpr nonstatic_self_type nonstatic() const { return *this; }
353 
354  template<TensorTileSize S>
356  RAJA_UNUSED_ARG(&c)) const
357  {}
358 
360 
361  RAJA_INLINE
362  void print() const
363  {
364  printf("StaticTensorTile: dims=%d, m_begin=", (int)s_num_dims);
365 
366  m_begin.print();
367 
368  printf(", m_size=");
369 
370  m_size.print();
371 
372  printf("\n");
373  }
374 };
375 
376 template<typename TILE, typename VALUE, size_t IDX>
378 
379 template<typename INDEX_TYPE,
380  TensorTileSize TENSOR_SIZE,
381  typename TBEGIN,
382  typename TSIZE,
383  INDEX_TYPE VALUE,
384  size_t IDX>
386  StaticTensorTile<INDEX_TYPE, TENSOR_SIZE, TBEGIN, TSIZE>,
387  camp::integral_constant<INDEX_TYPE, VALUE>,
388  IDX>
389 {
392  INDEX_TYPE,
393  TENSOR_SIZE,
395  TSIZE>;
396 };
397 
398 template<typename TILE, typename VALUE, size_t IDX>
400 
401 template<typename INDEX_TYPE,
402  TensorTileSize TENSOR_SIZE,
403  typename TBEGIN,
404  typename TSIZE,
405  INDEX_TYPE VALUE,
406  size_t IDX>
408  StaticTensorTile<INDEX_TYPE, TENSOR_SIZE, TBEGIN, TSIZE>,
409  camp::integral_constant<INDEX_TYPE, VALUE>,
410  IDX>
411 {
414  INDEX_TYPE,
415  TENSOR_SIZE,
416  TBEGIN,
418 };
419 
420 template<typename POINTER_TYPE,
421  typename INDEX_TYPE,
422  TensorTileSize TENSOR_SIZE,
423  camp::idx_t NUM_DIMS,
424  camp::idx_t STRIDE_ONE_DIM = -1>
425 struct TensorRef
426 {
427  static constexpr camp::idx_t s_stride_one_dim = STRIDE_ONE_DIM;
428  static constexpr camp::idx_t s_num_dims = NUM_DIMS;
429  static constexpr TensorTileSize s_tensor_size = TENSOR_SIZE;
430 
431  using self_type = TensorRef<POINTER_TYPE,
432  INDEX_TYPE,
433  TENSOR_SIZE,
434  NUM_DIMS,
435  STRIDE_ONE_DIM>;
437  using pointer_type = POINTER_TYPE;
438  using index_type = INDEX_TYPE;
439 
440 
442  index_type m_stride[NUM_DIMS];
444 
446 
447  RAJA_INLINE
448  void print() const
449  {
450  printf("TensorRef: dims=%d, m_pointer=%p, m_stride=[", (int)NUM_DIMS,
451  m_pointer);
452 
453  for (camp::idx_t i = 0; i < NUM_DIMS; ++i)
454  {
455  printf("%ld ", (long)m_stride[i]);
456  }
457 
458  printf("], stride_one_dim=%d\n", (int)STRIDE_ONE_DIM);
459 
460  m_tile.print();
461  }
462 };
463 
464 
465 template<typename POINTER_TYPE,
466  typename INDEX_TYPE,
467  TensorTileSize TENSOR_SIZE,
468  typename STRIDE_TYPE,
469  typename BEGIN_TYPE,
470  typename SIZE_TYPE,
471  camp::idx_t STRIDE_ONE_DIM = -1>
473 
474 template<typename POINTER_TYPE,
475  typename INDEX_TYPE,
476  TensorTileSize TENSOR_SIZE,
477  INDEX_TYPE... StrideInts,
478  INDEX_TYPE... BeginInts,
479  INDEX_TYPE... SizeInts,
480  camp::idx_t STRIDE_ONE_DIM>
481 struct StaticTensorRef<POINTER_TYPE,
482  INDEX_TYPE,
483  TENSOR_SIZE,
484  camp::int_seq<INDEX_TYPE, StrideInts...>,
485  camp::int_seq<INDEX_TYPE, BeginInts...>,
486  camp::int_seq<INDEX_TYPE, SizeInts...>,
487  STRIDE_ONE_DIM>
488 {
489 
490  static constexpr camp::idx_t s_num_dims = sizeof...(BeginInts);
491  static constexpr camp::idx_t s_stride_one_dim = STRIDE_ONE_DIM;
492  static constexpr TensorTileSize s_ref_tensor_size = TENSOR_SIZE;
493  using pointer_type = POINTER_TYPE;
494  using index_type = INDEX_TYPE;
495 
496  using stride_seq = camp::int_seq<INDEX_TYPE, StrideInts...>;
497  using begin_seq = camp::int_seq<INDEX_TYPE, BeginInts...>;
498  using size_seq = camp::int_seq<INDEX_TYPE, SizeInts...>;
499 
501 
502  static_assert((sizeof...(BeginInts) == sizeof...(SizeInts)) &&
503  (sizeof...(SizeInts) == sizeof...(StrideInts)),
504  "Mismatch between number of elements in Begin and Size series "
505  "of StaticTensorRef");
506 
507 
508  using self_type = StaticTensorRef<POINTER_TYPE,
509  INDEX_TYPE,
510  TENSOR_SIZE,
511  stride_seq,
512  begin_seq,
513  size_seq>;
514  using tile_type =
516 
517 
521 
523 
524  RAJA_INLINE
525  void print() const
526  {
527  printf("StaticTensorRef: dims=%d, m_pointer=%p, m_stride=", (int)s_num_dims,
528  m_pointer);
529 
530  m_stride.print();
531 
532  printf(", stride_one_dim=%d\n", (int)STRIDE_ONE_DIM);
533 
534  m_tile.print();
535  }
536 };
537 
538 
539 template<typename REF_TYPE, typename TILE_TYPE, typename DIM_SEQ>
541 
542 template<typename REF_TYPE, typename TILE_TYPE, camp::idx_t... DIM_SEQ>
543 struct MergeRefTile<REF_TYPE, TILE_TYPE, camp::idx_seq<DIM_SEQ...>>
544 {
545 
546  static_assert(
547  REF_TYPE::s_num_dims == TILE_TYPE::s_num_dims,
548  "Merging a ref with a tile requires an equivalent number of dimensions.");
549 
550  static constexpr camp::idx_t s_num_dims = REF_TYPE::s_num_dims;
551  static constexpr camp::idx_t s_stride_one_dim = REF_TYPE::s_stride_one_dim;
552  static constexpr TensorTileSize s_ref_tensor_size = TILE_TYPE::s_tensor_size;
553  using pointer_type = typename REF_TYPE::pointer_type;
554  using ref_index_type = typename REF_TYPE::index_type;
555 
556  static constexpr TensorTileSize s_tile_tensor_size = TILE_TYPE::s_tensor_size;
557  using tile_index_type = typename TILE_TYPE::index_type;
558 
561  s_tile_tensor_size,
562  s_num_dims,
563  s_stride_one_dim>;
565 
566  RAJA_INLINE
567 
569  static constexpr merge_type merge(REF_TYPE const& ref, TILE_TYPE const& tile)
570  {
571  return merge_type {
572  ref.m_pointer, {tile_index_type(ref.m_stride[DIM_SEQ])...}, tile};
573  }
574 
575  RAJA_INLINE
576 
578  static constexpr shift_type shift_origin(REF_TYPE const& ref,
579  TILE_TYPE const& tile_origin)
580  {
581  return shift_type {
582  ref.m_pointer - RAJA::sum<camp::idx_t>((tile_origin.m_begin[DIM_SEQ] *
583  ref.m_stride[DIM_SEQ])...),
584  {tile_index_type(ref.m_stride[DIM_SEQ])...},
585  ref.m_tile};
586  }
587 };
588 
589 template<typename POINTER_TYPE,
590  typename INDEX_TYPE1,
591  TensorTileSize RTENSOR_SIZE,
592  typename STRIDE,
593  INDEX_TYPE1... BEGIN1,
594  INDEX_TYPE1... SIZE1,
595  camp::idx_t STRIDE_ONE_DIM,
596  typename INDEX_TYPE2,
597  TensorTileSize TENSOR_SIZE,
598  typename BEGIN2,
599  typename SIZE2,
600  camp::idx_t... DIM_SEQ>
601 struct MergeRefTile<StaticTensorRef<POINTER_TYPE,
602  INDEX_TYPE1,
603  RTENSOR_SIZE,
604  STRIDE,
605  camp::int_seq<INDEX_TYPE1, BEGIN1...>,
606  camp::int_seq<INDEX_TYPE1, SIZE1...>,
607  STRIDE_ONE_DIM>,
608  StaticTensorTile<INDEX_TYPE2, TENSOR_SIZE, BEGIN2, SIZE2>,
609  camp::idx_seq<DIM_SEQ...>>
610 {
611 
612  using ref_tile_type = StaticTensorTile<INDEX_TYPE1,
613  RTENSOR_SIZE,
614  camp::int_seq<INDEX_TYPE1, BEGIN1...>,
615  camp::int_seq<INDEX_TYPE1, SIZE1...>>;
616 
617  using ref_type = StaticTensorRef<POINTER_TYPE,
618  INDEX_TYPE1,
619  RTENSOR_SIZE,
620  STRIDE,
621  camp::int_seq<INDEX_TYPE1, BEGIN1...>,
622  camp::int_seq<INDEX_TYPE1, SIZE1...>,
623  STRIDE_ONE_DIM>;
624 
626 
627  using ref_stride_type = typename ref_type ::stride_type;
628 
630  camp::int_seq<INDEX_TYPE2,
631  INDEX_TYPE2(ref_stride_type::value_at(DIM_SEQ))...>;
632 
633  using shift_begin_seq = camp::int_seq<INDEX_TYPE2, INDEX_TYPE2(BEGIN1)...>;
634  using shift_size_seq = camp::int_seq<INDEX_TYPE2, INDEX_TYPE2(SIZE1)...>;
635 
636  using shift_tile_type = StaticTensorTile<INDEX_TYPE2,
637  TENSOR_SIZE,
640 
642 
643  using merge_type = StaticTensorRef<POINTER_TYPE,
644  INDEX_TYPE2,
645  TENSOR_SIZE,
647  BEGIN2,
648  SIZE2,
649  STRIDE_ONE_DIM>;
650 
651  using shift_type = StaticTensorRef<POINTER_TYPE,
652  INDEX_TYPE2,
653  TENSOR_SIZE,
657  STRIDE_ONE_DIM>;
658 
659 
660  RAJA_INLINE
661 
663  static constexpr merge_type merge(ref_type const& ref, tile_type const& tile)
664  {
665  return merge_type {ref.m_pointer, new_stride_type(), tile};
666  }
667 
668  RAJA_INLINE
669 
671  static constexpr shift_type shift_origin(ref_type const& ref,
672  tile_type const& tile_origin)
673  {
674  return shift_type {
675  ref.m_pointer - RAJA::sum<camp::idx_t>((tile_origin.m_begin[DIM_SEQ] *
676  ref.m_stride[DIM_SEQ])...),
678  }
679 };
680 
681 template<typename REF_TYPE, typename TILE_TYPE>
682 RAJA_INLINE RAJA_HOST_DEVICE constexpr auto merge_ref_tile(
683  REF_TYPE const& ref,
684  TILE_TYPE const& tile) ->
685  typename MergeRefTile<
686  REF_TYPE,
687  TILE_TYPE,
688  camp::make_idx_seq_t<TILE_TYPE::s_num_dims>>::merge_type
689 {
690  return MergeRefTile<REF_TYPE, TILE_TYPE,
691  camp::make_idx_seq_t<TILE_TYPE::s_num_dims>>::merge(ref,
692  tile);
693 }
694 
699 template<typename REF_TYPE, typename TILE_TYPE>
700 RAJA_INLINE RAJA_HOST_DEVICE constexpr auto shift_tile_origin(
701  REF_TYPE const& ref,
702  TILE_TYPE const& tile_origin) ->
703  typename MergeRefTile<
704  REF_TYPE,
705  TILE_TYPE,
706  camp::make_idx_seq_t<TILE_TYPE::s_num_dims>>::shift_type
707 {
708  return MergeRefTile<
709  REF_TYPE, TILE_TYPE,
710  camp::make_idx_seq_t<TILE_TYPE::s_num_dims>>::shift_origin(ref,
711  tile_origin);
712 }
713 
717 template<typename INDEX_TYPE, TensorTileSize RTENSOR_SIZE, camp::idx_t NUM_DIMS>
718 RAJA_INLINE RAJA_HOST_DEVICE constexpr TensorTile<INDEX_TYPE,
719  TENSOR_FULL,
720  NUM_DIMS>&
722 {
723  return reinterpret_cast<TensorTile<INDEX_TYPE, TENSOR_FULL, NUM_DIMS>&>(tile);
724 }
725 
729 template<typename INDEX_TYPE, TensorTileSize RTENSOR_SIZE, camp::idx_t NUM_DIMS>
730 RAJA_INLINE RAJA_HOST_DEVICE constexpr TensorTile<INDEX_TYPE,
732  NUM_DIMS>&
734 {
735  return reinterpret_cast<TensorTile<INDEX_TYPE, TENSOR_PARTIAL, NUM_DIMS>&>(
736  tile);
737 }
738 
742 template<typename INDEX_TYPE,
743  TensorTileSize RTENSOR_SIZE,
744  typename TBEGIN,
745  typename TSIZE>
746 RAJA_INLINE RAJA_HOST_DEVICE constexpr StaticTensorTile<INDEX_TYPE,
747  TENSOR_FULL,
748  TBEGIN,
749  TSIZE>&
752 {
753  return reinterpret_cast<
755 }
756 
760 template<typename INDEX_TYPE,
761  TensorTileSize RTENSOR_SIZE,
762  typename TBEGIN,
763  typename TSIZE>
764 RAJA_INLINE RAJA_HOST_DEVICE constexpr StaticTensorTile<INDEX_TYPE,
766  TBEGIN,
767  TSIZE>&
770 {
771  return reinterpret_cast<
773 }
774 
775 
776 } // namespace expt
777 } // namespace internal
778 
779 } // namespace RAJA
780 
781 
782 #endif
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_UNUSED_ARG(x)
Definition: macros.hpp:97
TensorTileSize
Definition: TensorRef.hpp:234
@ TENSOR_MULTIPLE
Definition: TensorRef.hpp:237
@ TENSOR_PARTIAL
Definition: TensorRef.hpp:235
@ TENSOR_FULL
Definition: TensorRef.hpp:236
RAJA_INLINE constexpr RAJA_HOST_DEVICE TensorTile< INDEX_TYPE, TENSOR_FULL, NUM_DIMS > & make_tensor_tile_full(TensorTile< INDEX_TYPE, RTENSOR_SIZE, NUM_DIMS > &tile)
Definition: TensorRef.hpp:721
RAJA_INLINE constexpr RAJA_HOST_DEVICE auto shift_tile_origin(REF_TYPE const &ref, TILE_TYPE const &tile_origin) -> typename MergeRefTile< REF_TYPE, TILE_TYPE, camp::make_idx_seq_t< TILE_TYPE::s_num_dims >>::shift_type
Definition: TensorRef.hpp:700
RAJA_INLINE constexpr RAJA_HOST_DEVICE auto merge_ref_tile(REF_TYPE const &ref, TILE_TYPE const &tile) -> typename MergeRefTile< REF_TYPE, TILE_TYPE, camp::make_idx_seq_t< TILE_TYPE::s_num_dims >>::merge_type
Definition: TensorRef.hpp:682
RAJA_INLINE constexpr RAJA_HOST_DEVICE TensorTile< INDEX_TYPE, TENSOR_PARTIAL, NUM_DIMS > & make_tensor_tile_partial(TensorTile< INDEX_TYPE, RTENSOR_SIZE, NUM_DIMS > &tile)
Definition: TensorRef.hpp:733
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_HOST_DEVICE RAJA_INLINE void tile(CONTEXT const &ctx, TILE_T tile_size, SEGMENT const &segment, BODY const &body)
Definition: launch_core.hpp:589
typename PrependStaticIndexArray< INDEX_TYPE, HEAD+DELTA, typename Orig::Tail >::Type Type
Definition: TensorRef.hpp:187
typename PrependStaticIndexArray< INDEX_TYPE, HEAD+DELTA, typename Orig::Tail >::Seq Seq
Definition: TensorRef.hpp:190
typename PrependStaticIndexArray< INDEX_TYPE, HEAD, AddTail >::Seq Seq
Definition: TensorRef.hpp:170
typename PrependStaticIndexArray< INDEX_TYPE, HEAD, AddTail >::Type Type
Definition: TensorRef.hpp:169
typename AddStaticIndexArray< INDEX_TYPE, IDX - 1, DELTA, typename Orig::Tail >::Type AddTail
Definition: TensorRef.hpp:167
Definition: TensorRef.hpp:41
typename REF_TYPE::index_type ref_index_type
Definition: TensorRef.hpp:554
typename TILE_TYPE::index_type tile_index_type
Definition: TensorRef.hpp:557
RAJA_INLINE static constexpr RAJA_HOST_DEVICE merge_type merge(REF_TYPE const &ref, TILE_TYPE const &tile)
Definition: TensorRef.hpp:569
RAJA_INLINE static constexpr RAJA_HOST_DEVICE shift_type shift_origin(REF_TYPE const &ref, TILE_TYPE const &tile_origin)
Definition: TensorRef.hpp:578
typename REF_TYPE::pointer_type pointer_type
Definition: TensorRef.hpp:553
Definition: TensorRef.hpp:540
typename PrependStaticIndexArray< INDEX_TYPE, VALUE, typename Orig::Tail >::Type Type
Definition: TensorRef.hpp:227
typename PrependStaticIndexArray< INDEX_TYPE, VALUE, typename Orig::Tail >::Seq Seq
Definition: TensorRef.hpp:230
typename PrependStaticIndexArray< INDEX_TYPE, HEAD, SetTail >::Seq Seq
Definition: TensorRef.hpp:211
typename SetStaticIndexArray< INDEX_TYPE, IDX - 1, VALUE, typename Orig::Tail >::Type SetTail
Definition: TensorRef.hpp:208
typename PrependStaticIndexArray< INDEX_TYPE, HEAD, SetTail >::Type Type
Definition: TensorRef.hpp:210
Definition: TensorRef.hpp:44
RAJA_HOST_DEVICE RAJA_INLINE void print_values() const
Definition: TensorRef.hpp:93
camp::int_seq< INDEX_TYPE, HEAD, TAIL... > seq_type
Definition: TensorRef.hpp:50
RAJA_HOST_DEVICE RAJA_INLINE void print() const
Definition: TensorRef.hpp:102
RAJA_HOST_DEVICE constexpr RAJA_INLINE INDEX_TYPE operator[](size_t index) const
Definition: TensorRef.hpp:78
RAJA_HOST_DEVICE static constexpr RAJA_INLINE INDEX_TYPE value_at(size_t index)
Definition: TensorRef.hpp:63
RAJA_HOST_DEVICE constexpr RAJA_INLINE INDEX_TYPE operator[](size_t) const
Definition: TensorRef.hpp:128
RAJA_HOST_DEVICE RAJA_INLINE void print_values() const
Definition: TensorRef.hpp:133
camp::int_seq< INDEX_TYPE > seq_type
Definition: TensorRef.hpp:114
RAJA_HOST_DEVICE static constexpr RAJA_INLINE INDEX_TYPE value_at(size_t)
Definition: TensorRef.hpp:123
RAJA_HOST_DEVICE RAJA_INLINE void print() const
Definition: TensorRef.hpp:138
Definition: TensorRef.hpp:35
Definition: TensorRef.hpp:472
constexpr void copy(StaticTensorTile< INDEX_TYPE, S, begin_seq, size_seq > const RAJA_UNUSED_ARG(&c)) const
Definition: TensorRef.hpp:355
Definition: TensorRef.hpp:309
Definition: TensorRef.hpp:426
index_type m_stride[NUM_DIMS]
Definition: TensorRef.hpp:442
static constexpr camp::idx_t s_num_dims
Definition: TensorRef.hpp:428
static constexpr TensorTileSize s_tensor_size
Definition: TensorRef.hpp:429
pointer_type m_pointer
Definition: TensorRef.hpp:441
POINTER_TYPE pointer_type
Definition: TensorRef.hpp:437
static constexpr camp::idx_t s_stride_one_dim
Definition: TensorRef.hpp:427
RAJA_HOST_DEVICE RAJA_INLINE void print() const
Definition: TensorRef.hpp:448
INDEX_TYPE index_type
Definition: TensorRef.hpp:438
tile_type m_tile
Definition: TensorRef.hpp:443
Definition: TensorRef.hpp:242
RAJA_HOST_DEVICE RAJA_INLINE void print() const
Definition: TensorRef.hpp:284
void copy(TensorTile< I, S, NUM_DIMS > const &c)
Definition: TensorRef.hpp:253
static constexpr TensorTileSize s_tensor_size
Definition: TensorRef.hpp:250
INDEX_TYPE index_type
Definition: TensorRef.hpp:245
index_type m_begin[NUM_DIMS]
Definition: TensorRef.hpp:246
RAJA_HOST_DEVICE RAJA_INLINE self_type operator-(TensorTile< INDEX_TYPE2, TENSOR_SIZE2, NUM_DIMS > const &sub) const
Definition: TensorRef.hpp:271
index_type m_size[NUM_DIMS]
Definition: TensorRef.hpp:247
static constexpr camp::idx_t s_num_dims
Definition: TensorRef.hpp:249
TensorTile< INDEX_TYPE, TENSOR_SIZE, NUM_DIMS > self_type
Definition: TensorRef.hpp:243