RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
BinaryOperator.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_ET_TensorAdd_HPP
21 #define RAJA_pattern_tensor_ET_TensorAdd_HPP
22 
23 #include "RAJA/config.hpp"
24 
25 #include "RAJA/util/macros.hpp"
26 
29 
30 namespace RAJA
31 {
32 namespace internal
33 {
34 namespace expt
35 {
36 
37 
38 namespace ET
39 {
40 
41 
42 template<typename OPERATOR, typename LEFT_OPERAND, typename RIGHT_OPERAND>
44  : public TensorExpressionBase<
45  TensorBinaryOperator<OPERATOR, LEFT_OPERAND, RIGHT_OPERAND>>
46 {
47 public:
49  using operator_type = OPERATOR;
50  using left_operand_type = LEFT_OPERAND;
51  using right_operand_type = RIGHT_OPERAND;
52 
53  using element_type = typename LEFT_OPERAND::element_type;
54  using index_type = typename LEFT_OPERAND::index_type;
55 
58 
59  static constexpr camp::idx_t s_num_dims = operator_traits::s_num_dims;
60 
61 private:
62  left_operand_type m_left_operand;
63  right_operand_type m_right_operand;
64 
65 public:
66  RAJA_INLINE
67 
70  right_operand_type const& right)
71  : m_left_operand {left},
72  m_right_operand {right}
73  {}
74 
75  RAJA_INLINE
76 
78  constexpr auto getDimSize(camp::idx_t dim) const
79  -> decltype(operator_traits::getDimSize(dim,
80  m_left_operand,
81  m_right_operand))
82  {
83  return operator_traits::getDimSize(dim, m_left_operand, m_right_operand);
84  }
85 
86  template<typename TILE_TYPE>
87  RAJA_INLINE RAJA_HOST_DEVICE auto eval(TILE_TYPE const& tile) const
88  -> decltype(operator_type::eval(m_left_operand.eval(tile),
89  m_right_operand.eval(tile)))
90  {
91  return operator_type::eval(m_left_operand.eval(tile),
92  m_right_operand.eval(tile));
93  }
94 
95  RAJA_INLINE
96 
98  void print_ast() const
99  {
100  operator_type::print_ast();
101  printf("[");
102  operator_type::print_ast();
103  printf("](");
104  m_left_operand.print_ast();
105  printf(", ");
106  m_right_operand.print_ast();
107  printf(")");
108  }
109 };
110 
111 /*
112  * Overload for: arithmetic + tensorexpression
113 
114  */
115 template<typename LEFT_OPERAND,
116  typename RIGHT_OPERAND,
117  typename std::enable_if<std::is_arithmetic<LEFT_OPERAND>::value,
118  bool>::type = true,
119  typename std::enable_if<std::is_base_of<TensorExpressionConcreteBase,
120  RIGHT_OPERAND>::value,
121  bool>::type = true>
122 RAJA_INLINE RAJA_HOST_DEVICE auto operator+(LEFT_OPERAND const& left,
123  RIGHT_OPERAND const& right)
125  RIGHT_OPERAND>
126 {
128  RIGHT_OPERAND>(
130 }
131 
132 /*
133  * Overload for: arithmetic - tensorexpression
134 
135  */
136 template<typename LEFT_OPERAND,
137  typename RIGHT_OPERAND,
138  typename std::enable_if<std::is_arithmetic<LEFT_OPERAND>::value,
139  bool>::type = true,
140  typename std::enable_if<std::is_base_of<TensorExpressionConcreteBase,
141  RIGHT_OPERAND>::value,
142  bool>::type = true>
143 RAJA_INLINE RAJA_HOST_DEVICE auto operator-(LEFT_OPERAND const& left,
144  RIGHT_OPERAND const& right)
145  -> TensorSubtract<
147  RIGHT_OPERAND>
148 {
149  return TensorSubtract<
152  right);
153 }
154 
155 // /*
156 // * Overload for: arithmetic / tensorexpression
157 //
158 // */
159 // template<typename LEFT_OPERAND, typename RIGHT_OPERAND,
160 // typename std::enable_if<std::is_arithmetic<LEFT_OPERAND>::value,
161 // bool>::type = true, typename
162 // std::enable_if<std::is_base_of<TensorExpressionConcreteBase,
163 // RIGHT_OPERAND>::value, bool>::type = true>
164 // RAJA_INLINE
165 // RAJA_HOST_DEVICE
166 // auto operator/(LEFT_OPERAND const &left, RIGHT_OPERAND const &right) ->
167 // TensorDivide<typename NormalizeOperandHelper<LEFT_OPERAND>::return_type,
168 // RIGHT_OPERAND>
169 // {
170 // return TensorDivide<typename
171 // NormalizeOperandHelper<LEFT_OPERAND>::return_type,
172 // RIGHT_OPERAND>(NormalizeOperandHelper<LEFT_OPERAND>::normalize(left),
173 // right);
174 // }
175 
176 
177 } // namespace ET
178 
179 } // namespace expt
180 } // namespace internal
181 
182 } // namespace RAJA
183 
184 
185 #endif
RAJA header defining expression template behavior for operator*.
RAJA header file defining SIMD/SIMT register operations.
Definition: BinaryOperator.hpp:46
LEFT_OPERAND left_operand_type
Definition: BinaryOperator.hpp:50
RAJA_INLINE RAJA_HOST_DEVICE void print_ast() const
Definition: BinaryOperator.hpp:98
typename LEFT_OPERAND::element_type element_type
Definition: BinaryOperator.hpp:53
RAJA_INLINE RAJA_HOST_DEVICE TensorBinaryOperator(left_operand_type const &left, right_operand_type const &right)
Definition: BinaryOperator.hpp:69
RAJA_INLINE constexpr RAJA_HOST_DEVICE auto getDimSize(camp::idx_t dim) const -> decltype(operator_traits::getDimSize(dim, m_left_operand, m_right_operand))
Definition: BinaryOperator.hpp:78
OPERATOR operator_type
Definition: BinaryOperator.hpp:49
typename operator_traits::result_type result_type
Definition: BinaryOperator.hpp:57
static constexpr camp::idx_t s_num_dims
Definition: BinaryOperator.hpp:59
RAJA_INLINE RAJA_HOST_DEVICE auto eval(TILE_TYPE const &tile) const -> decltype(operator_type::eval(m_left_operand.eval(tile), m_right_operand.eval(tile)))
Definition: BinaryOperator.hpp:87
typename LEFT_OPERAND::index_type index_type
Definition: BinaryOperator.hpp:54
RIGHT_OPERAND right_operand_type
Definition: BinaryOperator.hpp:51
Definition: ExpressionTemplateBase.hpp:72
Header file for common RAJA internal macro definitions.
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
RAJA_INLINE RAJA_HOST_DEVICE auto operator-(LEFT_OPERAND const &left, RIGHT_OPERAND const &right) -> TensorSubtract< typename NormalizeOperandHelper< LEFT_OPERAND >::return_type, RIGHT_OPERAND >
Definition: BinaryOperator.hpp:143
RAJA_INLINE RAJA_HOST_DEVICE auto operator+(LEFT_OPERAND const &left, RIGHT_OPERAND const &right) -> TensorAdd< typename NormalizeOperandHelper< LEFT_OPERAND >::return_type, RIGHT_OPERAND >
Definition: BinaryOperator.hpp:122
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
Definition: normalizeOperand.hpp:44
Definition: BinaryOperatorTraits.hpp:89
static constexpr camp::idx_t s_num_dims
Definition: BinaryOperatorTraits.hpp:92
typename LHS_TYPE::result_type result_type
Definition: BinaryOperatorTraits.hpp:91
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LHS_TYPE const &lhs, RHS_TYPE const &rhs)
Definition: BinaryOperatorTraits.hpp:102