20 #ifndef RAJA_pattern_tensor_ET_TensorDivide_HPP
21 #define RAJA_pattern_tensor_ET_TensorDivide_HPP
23 #include "RAJA/config.hpp"
40 template<
typename LEFT_OPERAND_TYPE,
41 typename RIGHT_OPERAND_TYPE,
48 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
52 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 0 &&
53 RIGHT_OPERAND_TYPE::s_num_dims == 1>::type>
57 static constexpr camp::idx_t s_num_dims = RIGHT_OPERAND_TYPE::s_num_dims;
63 LEFT_OPERAND_TYPE
const&,
64 RIGHT_OPERAND_TYPE
const& right)
66 return right.getDimSize(dim);
72 template<
typename TILE_TYPE>
74 TILE_TYPE
const&
tile,
75 LEFT_OPERAND_TYPE
const& left,
76 RIGHT_OPERAND_TYPE
const& right)
82 return numerator.divide(right.eval(
tile));
85 return numerator.divide_n(right.eval(
tile),
tile.m_size[0]);
92 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
96 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 1 &&
97 RIGHT_OPERAND_TYPE::s_num_dims == 0>::type>
100 static constexpr camp::idx_t s_num_dims = LEFT_OPERAND_TYPE::s_num_dims;
107 LEFT_OPERAND_TYPE
const& left,
108 RIGHT_OPERAND_TYPE
const&)
110 return left.getDimSize(dim);
116 template<
typename TILE_TYPE>
118 TILE_TYPE
const&
tile,
119 LEFT_OPERAND_TYPE
const& left,
120 RIGHT_OPERAND_TYPE
const& right)
126 return left.eval(
tile).divide(denominator);
130 return left.eval(
tile).divide_n(denominator,
tile.m_size[0]);
138 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
142 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 1 &&
143 RIGHT_OPERAND_TYPE::s_num_dims == 1>::type>
146 static constexpr camp::idx_t s_num_dims = LEFT_OPERAND_TYPE::s_num_dims;
153 LEFT_OPERAND_TYPE
const& left,
154 RIGHT_OPERAND_TYPE
const&)
156 return left.getDimSize(dim);
162 template<
typename TILE_TYPE>
164 TILE_TYPE
const&
tile,
165 LEFT_OPERAND_TYPE
const& left,
166 RIGHT_OPERAND_TYPE
const& right)
170 return left.eval(
tile).divide(right.eval(
tile));
174 return left.eval(
tile).divide_n(right.eval(
tile),
tile.m_size[0]);
182 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
186 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 0 &&
187 RIGHT_OPERAND_TYPE::s_num_dims == 2>::type>
191 static constexpr camp::idx_t s_num_dims = RIGHT_OPERAND_TYPE::s_num_dims;
197 LEFT_OPERAND_TYPE
const&,
198 RIGHT_OPERAND_TYPE
const& right)
200 return right.getDimSize(dim);
206 template<
typename TILE_TYPE>
208 TILE_TYPE
const&
tile,
209 LEFT_OPERAND_TYPE
const& left,
210 RIGHT_OPERAND_TYPE
const& right)
216 return numerator.divide(right.eval(
tile));
219 return numerator.divide_nm(right.eval(
tile),
tile.m_size[0],
227 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
231 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 2 &&
232 RIGHT_OPERAND_TYPE::s_num_dims == 0>::type>
235 static constexpr camp::idx_t s_num_dims = LEFT_OPERAND_TYPE::s_num_dims;
242 LEFT_OPERAND_TYPE
const& left,
243 RIGHT_OPERAND_TYPE
const&)
245 return left.getDimSize(dim);
252 template<
typename TILE_TYPE>
254 TILE_TYPE
const&
tile,
255 LEFT_OPERAND_TYPE
const& left,
256 RIGHT_OPERAND_TYPE
const& right)
262 return left.eval(
tile).divide(denominator);
266 return left.eval(
tile).divide_nm(denominator,
tile.m_size[0],
275 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
279 typename
std::enable_if<LEFT_OPERAND_TYPE::s_num_dims == 2 &&
280 RIGHT_OPERAND_TYPE::s_num_dims == 2>::type>
283 static constexpr camp::idx_t s_num_dims = LEFT_OPERAND_TYPE::s_num_dims;
290 LEFT_OPERAND_TYPE
const& left,
291 RIGHT_OPERAND_TYPE
const&)
293 return left.getDimSize(dim);
299 template<
typename TILE_TYPE>
301 TILE_TYPE
const&
tile,
302 LEFT_OPERAND_TYPE
const& left,
303 RIGHT_OPERAND_TYPE
const& right)
307 return left.eval(
tile).divide(right.eval(
tile));
311 return left.eval(
tile).divide_nm(right.eval(
tile),
tile.m_size[0],
317 template<
typename LEFT_OPERAND_TYPE,
typename RIGHT_OPERAND_TYPE>
319 TensorDivide<LEFT_OPERAND_TYPE, RIGHT_OPERAND_TYPE>>
330 static constexpr camp::idx_t
s_num_dims = divide_op::s_num_dims;
343 : m_left_operand {left_operand},
344 m_right_operand {right_operand}
352 return divide_op::getDimSize(dim, m_left_operand, m_right_operand);
355 template<
typename TILE_TYPE>
358 return divide_op::divide(
tile, m_left_operand, m_right_operand);
369 return m_left_operand;
380 return m_right_operand;
389 m_left_operand.print_ast();
391 m_right_operand.print_ast();
403 typename std::enable_if<std::is_arithmetic<LHS>::value,
bool>::type =
true,
404 typename std::enable_if<
405 std::is_base_of<TensorExpressionConcreteBase, RHS>::value,
408 RHS
const& right_operand)
RAJA header file defining SIMD/SIMT register operations.
Definition: TensorDivide.hpp:320
typename LEFT_OPERAND_TYPE::index_type index_type
Definition: TensorDivide.hpp:326
RIGHT_OPERAND_TYPE right_operand_type
Definition: TensorDivide.hpp:324
static constexpr camp::idx_t s_num_dims
Definition: TensorDivide.hpp:330
RAJA_INLINE constexpr RAJA_HOST_DEVICE left_operand_type const & getLeftOperand() const
Definition: TensorDivide.hpp:367
RAJA_INLINE RAJA_HOST_DEVICE void print_ast() const
Definition: TensorDivide.hpp:386
LEFT_OPERAND_TYPE left_operand_type
Definition: TensorDivide.hpp:323
typename divide_op::result_type result_type
Definition: TensorDivide.hpp:329
RAJA_INLINE constexpr RAJA_HOST_DEVICE right_operand_type const & getRightOperand() const
Definition: TensorDivide.hpp:378
RAJA_INLINE RAJA_HOST_DEVICE TensorDivide(left_operand_type const &left_operand, right_operand_type const &right_operand)
Definition: TensorDivide.hpp:341
RAJA_INLINE constexpr RAJA_HOST_DEVICE index_type getDimSize(index_type dim) const
Definition: TensorDivide.hpp:350
RAJA_INLINE RAJA_HOST_DEVICE result_type eval(TILE_TYPE const &tile) const
Definition: TensorDivide.hpp:356
typename LEFT_OPERAND_TYPE::element_type element_type
Definition: TensorDivide.hpp:325
Definition: ExpressionTemplateBase.hpp:72
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
RAJA_INLINE RAJA_HOST_DEVICE auto operator/(LHS const &left_operand, RHS const &right_operand) -> TensorDivide< typename NormalizeOperandHelper< LHS >::return_type, RHS >
Definition: TensorDivide.hpp:407
@ TENSOR_FULL
Definition: TensorRef.hpp:236
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: ListSegment.hpp:416
RAJA_SUPPRESS_HD_WARN RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:253
typename LEFT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:234
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &)
Definition: TensorDivide.hpp:241
typename RIGHT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:190
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:196
RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:207
RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:117
typename LEFT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:99
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &)
Definition: TensorDivide.hpp:106
RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:73
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:62
typename RIGHT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:56
RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:163
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &)
Definition: TensorDivide.hpp:152
typename LEFT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:145
RAJA_INLINE static RAJA_HOST_DEVICE result_type divide(TILE_TYPE const &tile, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &right)
Definition: TensorDivide.hpp:300
typename LEFT_OPERAND_TYPE::result_type result_type
Definition: TensorDivide.hpp:282
RAJA_INLINE static RAJA_HOST_DEVICE int getDimSize(int dim, LEFT_OPERAND_TYPE const &left, RIGHT_OPERAND_TYPE const &)
Definition: TensorDivide.hpp:289
Definition: TensorDivide.hpp:43
Definition: normalizeOperand.hpp:44