RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
TensorRegisterBase.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_TensorRegisterBase_HPP
21 #define RAJA_pattern_tensor_TensorRegisterBase_HPP
22 
23 #include "RAJA/config.hpp"
24 
25 #include "RAJA/util/macros.hpp"
26 
27 #include "camp/camp.hpp"
30 
31 namespace RAJA
32 {
33 namespace internal
34 {
35 namespace expt
36 {
37 
38 
39 namespace ET
40 {
41 class TensorExpressionConcreteBase;
42 } // namespace ET
43 
44 template<typename TENSOR, camp::idx_t DIM>
46 {
47  static constexpr camp::idx_t value = TENSOR::s_dim_size(DIM);
48 };
49 
50 /*
51  * Tensor product helper class.
52  *
53  * This defines the default product operation between types when using the
54  * operator*
55  *
56  */
57 template<typename LHS, typename RHS>
59 {
60 
61  using multiply_type = decltype(LHS().multiply(RHS()));
62 
63  // default multiplication operator
65 
66  RAJA_INLINE
67  static multiply_type multiply(LHS const& lhs, RHS const& rhs)
68  {
69  return lhs.multiply(rhs);
70  }
71 };
72 
73 template<typename REF_TYPE>
75 {
77  REF_TYPE m_ref;
78 
80  template<typename RHS>
81  RAJA_HOST_DEVICE RAJA_INLINE self_type operator=(RHS const& rhs)
82  {
83 
84  rhs.store_ref(m_ref);
85  return *this;
86  }
87 };
88 
89 template<camp::idx_t N, camp::idx_t D>
91 {
92  static constexpr camp::idx_t value = (N % D) > 0 ? (1 + N / D) : (N / D);
93 };
94 
96 {};
97 
104 template<typename Derived>
106 
107 template<typename REGISTER_POLICY,
108  typename T,
109  typename LAYOUT,
110  typename camp::idx_t... SIZES>
112  RAJA::expt::
113  TensorRegister<REGISTER_POLICY, T, LAYOUT, camp::idx_seq<SIZES...>>>
115 {
116 public:
117  using self_type = RAJA::expt::
118  TensorRegister<REGISTER_POLICY, T, LAYOUT, camp::idx_seq<SIZES...>>;
119  using element_type = camp::decay<T>;
120 
121  static constexpr camp::idx_t s_num_dims = sizeof...(SIZES);
122 
123  static constexpr camp::idx_t s_num_registers =
126 
127  using index_type = camp::idx_t;
128 
130 
131  using register_policy = REGISTER_POLICY;
132 
133 private:
135 
136  RAJA_INLINE
137  self_type* getThis() { return static_cast<self_type*>(this); }
138 
140 
141  RAJA_INLINE
142  constexpr self_type const* getThis() const
143  {
144  return static_cast<self_type const*>(this);
145  }
146 
147 protected:
148  register_type m_registers[s_num_registers];
149 
150 public:
152 
153  RAJA_INLINE
154  constexpr TensorRegisterBase() {}
155 
157 
158  RAJA_INLINE
159  TensorRegisterBase(element_type c) { broadcast(c); }
160 
161  RAJA_INLINE
162 
164  TensorRegisterBase(self_type const& c) { copy(c); }
165 
167 
168  RAJA_INLINE
170 
171  /*
172  * Overload for: assignment of ET to a TensorRegister
173  */
174  template<typename RHS,
175  typename std::enable_if<
176  std::is_base_of<ET::TensorExpressionConcreteBase, RHS>::value,
177  bool>::type = true>
178  RAJA_INLINE RAJA_HOST_DEVICE TensorRegisterBase(RHS const& rhs)
179  {
180  // evaluate a single tile of the ET, storing in this TensorRegister
181  *this = rhs.eval(self_type::s_get_default_tile());
182  }
183 
184  template<typename... REGS>
186  REGS const&... regs)
187  : m_registers {reg0, regs...}
188  {
189  static_assert(1 + sizeof...(REGS) == s_num_registers,
190  "Incompatible number of registers");
191  }
192 
194 
195  RAJA_INLINE
196  static constexpr bool is_root() { return register_type::is_root(); }
197 
198  template<typename REF_TYPE>
199  RAJA_HOST_DEVICE RAJA_INLINE static constexpr TensorRegisterStoreRef<REF_TYPE>
200  create_et_store_ref(REF_TYPE const& ref)
201  {
203  }
204 
206  template<typename REF_TYPE>
207  RAJA_HOST_DEVICE RAJA_INLINE static self_type s_load_ref(REF_TYPE const& ref)
208  {
209 
210  self_type value;
211 
212  value.load_ref(ref);
213  return value;
214  }
215 
221 
222  RAJA_INLINE
223  static constexpr int s_dim_elem(int dim)
224  {
225  return (dim == 0) ? self_type::s_num_elem : 0;
226  }
227 
234 
235  RAJA_INLINE
236  static constexpr StaticTensorTile<int,
237  TENSOR_FULL,
238  camp::int_seq<int, int(SIZES * 0)...>,
239  camp::int_seq<int, int(SIZES)...>>
241  {
242  return StaticTensorTile<int, TENSOR_FULL,
243  camp::int_seq<int, int(SIZES * 0)...>,
244  camp::int_seq<int, int(SIZES)...>>();
245  }
246 
253 
254  RAJA_INLINE
255  constexpr bool sink() const { return false; }
256 
261 
262  RAJA_INLINE
264  {
265  for (camp::idx_t i = 0; i < s_num_registers; ++i)
266  {
267  m_registers[i] = c.vec(i);
268  }
269  return *getThis();
270  }
271 
276 
277  RAJA_INLINE
279  {
280  for (camp::idx_t i = 0; i < s_num_registers; ++i)
281  {
282  m_registers[i] = register_type(0);
283  }
284 
285 
286  return *getThis();
287  }
288 
293 
294  RAJA_INLINE
296  {
297  for (camp::idx_t i = 0; i < s_num_registers; ++i)
298  {
299  m_registers[i].broadcast(v);
300  }
301  return *getThis();
302  }
303 
309 
310  RAJA_INLINE
311  self_type& broadcast_n(element_type const& value, camp::idx_t N)
312  {
313  for (camp::idx_t i = 0; i < N; ++i)
314  {
315  getThis()->set(value, i);
316  }
317  return *getThis();
318  }
319 
325 
326  RAJA_INLINE
328  {
329  self_type x;
330  x.broadcast(getThis()->get(i));
331  return x;
332  }
333 
335 
336  RAJA_INLINE
337  self_type add(self_type const& mat) const
338  {
339  self_type result;
340  for (camp::idx_t i = 0; i < s_num_registers; ++i)
341  {
342  result.vec(i) = m_registers[i].add(mat.vec(i));
343  }
344  return result;
345  }
346 
348 
349  RAJA_INLINE
350  self_type subtract(self_type const& mat) const
351  {
352  self_type result;
353  for (camp::idx_t i = 0; i < s_num_registers; ++i)
354  {
355  result.vec(i) = m_registers[i].subtract(mat.vec(i));
356  }
357  return result;
358  }
359 
364 
365  RAJA_INLINE
366  self_type multiply(self_type const& x) const
367  {
368  self_type result;
369  for (camp::idx_t i = 0; i < s_num_registers; ++i)
370  {
371  result.vec(i) = m_registers[i].multiply(x.vec(i));
372  }
373  return result;
374  }
375 
380 
381  RAJA_INLINE
382  self_type multiply_add(self_type const& x, self_type const& add) const
383  {
384  self_type result;
385  for (camp::idx_t i = 0; i < s_num_registers; ++i)
386  {
387  result.vec(i) = m_registers[i].multiply_add(x.vec(i), add.vec(i));
388  }
389  return result;
390  }
391 
393 
394  RAJA_INLINE
395  self_type divide(self_type const& mat) const
396  {
397  self_type result;
398  for (camp::idx_t reg = 0; reg < s_num_registers; ++reg)
399  {
400  result.vec(reg) = m_registers[reg].divide(mat.vec(reg));
401  }
402  return result;
403  }
404 
410  RAJA_INLINE
411 
413  element_type dot(self_type const& x) const
414  {
415  element_type result(0);
416 
417  for (camp::idx_t reg = 0; reg < s_num_registers; ++reg)
418  {
419  result += m_registers[reg].multiply(x.vec(reg)).sum();
420  }
421 
422  return result;
423  }
424 
431 
432  RAJA_INLINE
434  {
435  getThis()->broadcast(value);
436  return *getThis();
437  }
438 
444  template<typename T2>
447  T2,
449  camp::idx_seq<>> const& value)
450  {
451  getThis()->broadcast(value.get(0));
452  return *getThis();
453  }
454 
462 
463  RAJA_INLINE
464  self_type const& operator=(self_type const& x)
465  {
466  getThis()->copy(x);
467  return *getThis();
468  }
469 
477 
478  RAJA_INLINE
479  self_type operator+(self_type const& x) const { return getThis()->add(x); }
480 
488 
489  RAJA_INLINE
491  {
492  *getThis() = getThis()->add(x);
493  return *getThis();
494  }
495 
503 
504  RAJA_INLINE
505  self_type operator+(element_type const& x) const { return getThis()->add(x); }
506 
514 
515  RAJA_INLINE
517  {
518  *getThis() = getThis()->add(x);
519  return *getThis();
520  }
521 
528 
529  RAJA_INLINE
530  self_type operator-() const { return self_type(0).subtract(*getThis()); }
531 
539 
540  RAJA_INLINE
541  self_type operator-(self_type const& x) const
542  {
543  return getThis()->subtract(x);
544  }
545 
553 
554  RAJA_INLINE
556  {
557  *getThis() = getThis()->subtract(x);
558  return *getThis();
559  }
560 
568 
569  RAJA_INLINE
571  {
572  return getThis()->subtract(x);
573  }
574 
582 
583  RAJA_INLINE
585  {
586  *getThis() = getThis()->subtract(x);
587  return *getThis();
588  }
589 
595  template<typename RHS>
596  RAJA_HOST_DEVICE RAJA_INLINE
598  operator*(RHS const& rhs) const
599  {
600  return TensorDefaultOperation<self_type, RHS>::multiply(*getThis(), rhs);
601  }
602 
608  template<typename RHS>
609  RAJA_HOST_DEVICE RAJA_INLINE self_type& operator*=(RHS const& rhs)
610  {
611  *getThis() =
613  return *getThis();
614  }
615 
622  RAJA_INLINE
623 
625  self_type operator/(self_type const& x) const { return getThis()->divide(x); }
626 
634 
635  RAJA_INLINE
637  {
638  *getThis() = getThis()->divide(x);
639  return *getThis();
640  }
641 
648  RAJA_INLINE
649 
652  {
653  return getThis()->divide(x);
654  }
655 
663 
664  RAJA_INLINE
666  {
667  *getThis() = getThis()->divide(x);
668  return *getThis();
669  }
670 
675 
676  RAJA_INLINE
678  {
679  self_type result;
680  for (camp::idx_t i = 0; i < s_num_registers; ++i)
681  {
682  result.vec(i) = m_registers[i].vmin(x.vec(i));
683  }
684  return result;
685  }
686 
691 
692  RAJA_INLINE
694  {
695  self_type result;
696  for (camp::idx_t i = 0; i < s_num_registers; ++i)
697  {
698  result.vec(i) = m_registers[i].vmax(x.vec(i));
699  }
700  return result;
701  }
702 
704 
705  RAJA_INLINE
706  register_type& vec(int i) { return m_registers[i]; }
707 
709 
710  RAJA_INLINE
711  constexpr register_type const& vec(int i) const { return m_registers[i]; }
712 
714 
715  RAJA_INLINE
716  register_type& get_register(int reg) { return m_registers[reg]; }
717 
719 
720  RAJA_INLINE
721  constexpr register_type const& get_register(int reg) const
722  {
723  return m_registers[reg];
724  }
725 
736  RAJA_INLINE
737 
739  self_type multiply_subtract(self_type const& b, self_type const& c) const
740  {
741  return getThis()->multiply_add(b, -c);
742  }
743 
748  RAJA_INLINE
749 
752  {
753  return getThis()->multiply(self_type(c));
754  }
755 
760  RAJA_INLINE
761 
764  {
765  *getThis() = getThis()->add(x);
766  return *getThis();
767  }
768 
773  RAJA_INLINE
774 
777  {
778  *getThis() = getThis()->subtract(x);
779  return *getThis();
780  }
781 
786  RAJA_INLINE
787 
790  {
791  *getThis() = getThis()->multiply(x);
792  return *getThis();
793  }
794 
799  RAJA_INLINE
800 
803  {
804  *getThis() = getThis()->multiply_add(x, y);
805  return *getThis();
806  }
807 
812  RAJA_INLINE
813 
816  {
817  *getThis() = getThis()->multiply_subtract(x, y);
818  return *getThis();
819  }
820 
825  RAJA_INLINE
826 
829  {
830  *getThis() = getThis()->divide(x);
831  return *getThis();
832  }
833 
838  RAJA_INLINE
839 
842  {
843  *getThis() = getThis()->scale(x);
844  return *getThis();
845  }
846 };
847 
848 } // namespace expt
849 
850 } // namespace internal
851 
852 } // namespace RAJA
853 
854 
855 #endif
RAJA header file defining SIMD/SIMT register operations.
RAJA header file defining SIMD/SIMT register operations.
Definition: RegisterBase.hpp:39
Definition: TensorRegister.hpp:46
RAJA_HOST_DEVICE RAJA_INLINE self_type & operator*=(RHS const &rhs)
Multiply a vector with this vector.
Definition: TensorRegisterBase.hpp:609
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type multiply_subtract(self_type const &b, self_type const &c) const
Fused multiply subtract: fms(b, c) = (*this)*b-c.
Definition: TensorRegisterBase.hpp:739
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_divide(self_type x)
Definition: TensorRegisterBase.hpp:828
RAJA_INLINE RAJA_HOST_DEVICE TensorRegisterBase(self_type const &c)
Definition: TensorRegisterBase.hpp:164
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator/=(element_type const &x)
Divide this vector by another vector.
Definition: TensorRegisterBase.hpp:665
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_multiply_subtract(self_type x, self_type y)
Definition: TensorRegisterBase.hpp:815
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_scale(element_type x)
Definition: TensorRegisterBase.hpp:841
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & broadcast_n(element_type const &value, camp::idx_t N)
Broadcast scalar value to first N register elements.
Definition: TensorRegisterBase.hpp:311
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_multiply(self_type x)
Definition: TensorRegisterBase.hpp:789
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type scale(element_type c) const
Definition: TensorRegisterBase.hpp:751
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type const & operator=(RAJA::expt::TensorRegister< RAJA::expt::scalar_register, T2, RAJA::expt::ScalarLayout, camp::idx_seq<>> const &value)
Set entire vector to a single scalar value.
Definition: TensorRegisterBase.hpp:445
RAJA_HOST_DEVICE RAJA_INLINE self_type & copy(self_type const &c)
Definition: TensorRegisterBase.hpp:263
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_add(self_type x)
Definition: TensorRegisterBase.hpp:763
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator/=(self_type const &x)
Divide this vector by another vector.
Definition: TensorRegisterBase.hpp:636
RAJA_HOST_DEVICE RAJA_INLINE self_type vmin(self_type x) const
Returns element wise minimum value tensor.
Definition: TensorRegisterBase.hpp:677
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type operator/(element_type const &x) const
Divide by a scalar, element wise.
Definition: TensorRegisterBase.hpp:651
RAJA_HOST_DEVICE RAJA_INLINE self_type divide(self_type const &mat) const
Definition: TensorRegisterBase.hpp:395
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator+(element_type const &x) const
Add vector to a scalar.
Definition: TensorRegisterBase.hpp:505
RAJA_INLINE RAJA_HOST_DEVICE TensorRegisterBase(RHS const &rhs)
Definition: TensorRegisterBase.hpp:178
RAJA_HOST_DEVICE RAJA_INLINE self_type vmax(self_type x) const
Returns element wise maximum value tensor.
Definition: TensorRegisterBase.hpp:693
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type operator/(self_type const &x) const
Divide two vector registers, element wise.
Definition: TensorRegisterBase.hpp:625
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator-=(self_type const &x)
Subtract a vector from this vector.
Definition: TensorRegisterBase.hpp:555
RAJA_HOST_DEVICE RAJA_INLINE TensorDefaultOperation< self_type, RHS >::multiply_type operator*(RHS const &rhs) const
Multiply two vector registers, element wise.
Definition: TensorRegisterBase.hpp:598
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator+=(self_type const &x)
Add a vector to this vector.
Definition: TensorRegisterBase.hpp:490
RAJA_HOST_DEVICE RAJA_INLINE self_type add(self_type const &mat) const
Definition: TensorRegisterBase.hpp:337
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type const & operator=(element_type value)
Set entire vector to a single scalar value.
Definition: TensorRegisterBase.hpp:433
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type const & operator=(self_type const &x)
Assign one register to antoher.
Definition: TensorRegisterBase.hpp:464
RAJA_HOST_DEVICE constexpr RAJA_INLINE register_type const & vec(int i) const
Definition: TensorRegisterBase.hpp:711
RAJA_HOST_DEVICE RAJA_INLINE self_type & broadcast(element_type v)
Definition: TensorRegisterBase.hpp:295
RAJA_HOST_DEVICE RAJA_INLINE register_type & vec(int i)
Definition: TensorRegisterBase.hpp:706
RAJA_HOST_DEVICE static constexpr RAJA_INLINE StaticTensorTile< int, TENSOR_FULL, camp::int_seq< int, int(SIZES *0)... >, camp::int_seq< int, int(SIZES)... > > s_get_default_tile()
Definition: TensorRegisterBase.hpp:240
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type get_and_broadcast(int i) const
Extracts a scalar value and broadcasts to a new register.
Definition: TensorRegisterBase.hpp:327
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_multiply_add(self_type x, self_type y)
Definition: TensorRegisterBase.hpp:802
RAJA_HOST_DEVICE RAJA_INLINE register_type & get_register(int reg)
Definition: TensorRegisterBase.hpp:716
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator-() const
Negate the value of this vector.
Definition: TensorRegisterBase.hpp:530
RAJA_HOST_DEVICE constexpr RAJA_INLINE bool sink() const
convenience routine to allow Vector classes to use camp::sink() across a variety of register types,...
Definition: TensorRegisterBase.hpp:255
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator-(element_type const &x) const
Subtract scalar from this register.
Definition: TensorRegisterBase.hpp:570
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator+(self_type const &x) const
Add two vector registers.
Definition: TensorRegisterBase.hpp:479
RAJA_HOST_DEVICE RAJA_INLINE TensorRegisterBase(element_type c)
Definition: TensorRegisterBase.hpp:159
RAJA_SUPPRESS_HD_WARN RAJA_INLINE RAJA_HOST_DEVICE self_type & inplace_subtract(self_type x)
Definition: TensorRegisterBase.hpp:776
RAJA_HOST_DEVICE static constexpr RAJA_INLINE int s_dim_elem(int dim)
Definition: TensorRegisterBase.hpp:223
RAJA_HOST_DEVICE RAJA_INLINE self_type subtract(self_type const &mat) const
Definition: TensorRegisterBase.hpp:350
RAJA_HOST_DEVICE constexpr RAJA_INLINE register_type const & get_register(int reg) const
Definition: TensorRegisterBase.hpp:721
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator-=(element_type const &x)
Subtract a scalar from this vector.
Definition: TensorRegisterBase.hpp:584
RAJA_INLINE RAJA_HOST_DEVICE element_type dot(self_type const &x) const
Dot product of two vectors.
Definition: TensorRegisterBase.hpp:413
RAJA_HOST_DEVICE RAJA_INLINE TensorRegisterBase(register_type reg0, REGS const &... regs)
Definition: TensorRegisterBase.hpp:185
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator-(self_type const &x) const
Subtract two vector registers.
Definition: TensorRegisterBase.hpp:541
RAJA_HOST_DEVICE static constexpr RAJA_INLINE bool is_root()
Definition: TensorRegisterBase.hpp:196
RAJA_HOST_DEVICE RAJA_INLINE self_type multiply(self_type const &x) const
Definition: TensorRegisterBase.hpp:366
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type & operator+=(element_type x)
Add a scalar to this vector.
Definition: TensorRegisterBase.hpp:516
RAJA_HOST_DEVICE static constexpr RAJA_INLINE TensorRegisterStoreRef< REF_TYPE > create_et_store_ref(REF_TYPE const &ref)
Definition: TensorRegisterBase.hpp:200
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE static RAJA_INLINE self_type s_load_ref(REF_TYPE const &ref)
Definition: TensorRegisterBase.hpp:207
RAJA_HOST_DEVICE RAJA_INLINE self_type multiply_add(self_type const &x, self_type const &add) const
Definition: TensorRegisterBase.hpp:382
Definition: TensorRegisterBase.hpp:105
Definition: TensorRegisterBase.hpp:96
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_SUPPRESS_HD_WARN
Definition: macros.hpp:68
@ TENSOR_FULL
Definition: TensorRef.hpp:236
Definition: AlignedRangeIndexSetBuilders.cpp:35
RAJA_HOST_DEVICE constexpr RAJA_INLINE RAJA::zip_tuple_element_t< I, zip_tuple< is_val, Ts... > > & get(zip_tuple< is_val, Ts... > &z) noexcept
Definition: zip_tuple.hpp:56
Definition: TensorLayout.hpp:35
Definition: arch.hpp:114
Definition: TensorRegisterBase.hpp:91
static constexpr camp::idx_t value
Definition: TensorRegisterBase.hpp:92
Definition: TensorRef.hpp:309
Definition: TensorRegisterBase.hpp:59
RAJA_HOST_DEVICE static RAJA_INLINE multiply_type multiply(LHS const &lhs, RHS const &rhs)
Definition: TensorRegisterBase.hpp:67
decltype(LHS().multiply(RHS())) multiply_type
Definition: TensorRegisterBase.hpp:61
Definition: TensorRegisterBase.hpp:46
static constexpr camp::idx_t value
Definition: TensorRegisterBase.hpp:47
Definition: TensorRegisterBase.hpp:75
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE RAJA_INLINE self_type operator=(RHS const &rhs)
Definition: TensorRegisterBase.hpp:81
REF_TYPE m_ref
Definition: TensorRegisterBase.hpp:77