20 #ifndef RAJA_PATTERN_DETAIL_MULTI_REDUCE_HPP
21 #define RAJA_PATTERN_DETAIL_MULTI_REDUCE_HPP
31 #define RAJA_DECLARE_MULTI_REDUCER(OP_NAME, OP, POL, DATA) \
32 template<typename tuning, typename T> \
33 struct MultiReduce##OP_NAME<POL<tuning>, T> \
34 : reduce::detail::BaseMultiReduce##OP_NAME< \
35 DATA<T, RAJA::reduce::OP<T>, tuning>> \
37 using policy = POL<tuning>; \
38 using Base = reduce::detail::BaseMultiReduce##OP_NAME< \
39 DATA<T, RAJA::reduce::OP<T>, tuning>>; \
41 using typename Base::value_type; \
42 using typename Base::reference; \
44 RAJA_SUPPRESS_HD_WARN \
46 reference operator[](size_t bin) const { return reference(*this, bin); } \
49 #define RAJA_DECLARE_ALL_MULTI_REDUCERS(POL, DATA) \
50 RAJA_DECLARE_MULTI_REDUCER(Sum, sum, POL, DATA) \
51 RAJA_DECLARE_MULTI_REDUCER(Min, min, POL, DATA) \
52 RAJA_DECLARE_MULTI_REDUCER(Max, max, POL, DATA) \
53 RAJA_DECLARE_MULTI_REDUCER(BitOr, or_bit, POL, DATA) \
54 RAJA_DECLARE_MULTI_REDUCER(BitAnd, and_bit, POL, DATA)
65 template<
typename t_MultiReduceData>
70 using value_type =
typename t_MultiReduceData::value_type;
77 value_type init_val = MultiReduceOp::identity(),
78 value_type identity = MultiReduceOp::identity())
82 template<
typename Container,
83 concepts::enable_if_t<
84 type_traits::is_range<Container>,
85 concepts::negate<std::is_convertible<Container, size_t>>,
86 concepts::negate<std::is_base_of<BaseMultiReduce, Container>>>* =
89 value_type identity = MultiReduceOp::identity())
90 : data {container, identity}
108 value_type init_val = MultiReduceOp::identity(),
109 value_type identity = MultiReduceOp::identity())
114 template<
typename Container,
115 concepts::enable_if_t<type_traits::is_range<Container>>* =
nullptr>
116 void reset(Container
const& container,
117 value_type identity = MultiReduceOp::identity())
119 for (
size_t bin = 0; bin < data.num_bins(); ++bin)
123 data.reset(container, identity);
129 size_t size()
const {
return data.num_bins(); }
136 data.combine(bin, other);
144 template<
typename Container,
145 concepts::enable_if_t<type_traits::is_range<Container>>* =
nullptr>
149 if (
size_t(distance_it) != data.num_bins())
152 "than multi reducer");
155 for (
auto& val : container)
173 template<
typename MultiReduceData>
223 template<
typename MultiReduceData>
272 template<
typename MultiReduceData>
321 template<
typename MultiReduceData>
370 template<
typename MultiReduceData>
Header file for RAJA operator definitions.
Header file for RAJA RepeatView constructs.
Bitwise AND reducer class template.
Definition: multi_reduce.hpp:372
BaseMultiReduceBitAnd & operator=(BaseMultiReduceBitAnd const &)=delete
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduceBitAnd()=default
BaseMultiReduceBitAnd & operator=(BaseMultiReduceBitAnd &&)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceBitAnd(BaseMultiReduceBitAnd const &)=default
RAJA_SUPPRESS_HD_WARN BaseMultiReduceBitAnd(BaseMultiReduceBitAnd &&)=default
Bitwise OR reducer class template.
Definition: multi_reduce.hpp:323
BaseMultiReduceBitOr & operator=(BaseMultiReduceBitOr const &)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceBitOr(BaseMultiReduceBitOr &&)=default
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduceBitOr()=default
BaseMultiReduceBitOr & operator=(BaseMultiReduceBitOr &&)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceBitOr(BaseMultiReduceBitOr const &)=default
Max reducer class template.
Definition: multi_reduce.hpp:225
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMax(BaseMultiReduceMax const &)=default
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduceMax()=default
BaseMultiReduceMax & operator=(BaseMultiReduceMax const &)=delete
BaseMultiReduceMax & operator=(BaseMultiReduceMax &&)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMax(BaseMultiReduceMax &&)=default
Min reducer class template.
Definition: multi_reduce.hpp:175
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMin(BaseMultiReduceMin &&)=default
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduceMin()=default
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMin & operator=(BaseMultiReduceMin &&)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMin(BaseMultiReduceMin const &)=default
RAJA_SUPPRESS_HD_WARN BaseMultiReduceMin & operator=(BaseMultiReduceMin const &)=delete
Sum reducer class template.
Definition: multi_reduce.hpp:274
RAJA_SUPPRESS_HD_WARN BaseMultiReduceSum(BaseMultiReduceSum &&)=default
BaseMultiReduceSum & operator=(BaseMultiReduceSum &&)=delete
BaseMultiReduceSum & operator=(BaseMultiReduceSum const &)=delete
RAJA_SUPPRESS_HD_WARN BaseMultiReduceSum(BaseMultiReduceSum const &)=default
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduceSum()=default
Header file for common RAJA internal macro definitions.
RAJA_HOST_DEVICE RAJA_INLINE void RAJA_UNUSED_VAR(T &&...) noexcept
Definition: macros.hpp:120
RAJA_HOST_DEVICE void RAJA_ABORT_OR_THROW(const char *str)
Definition: macros.hpp:143
#define RAJA_HOST_DEVICE
Definition: macros.hpp:65
#define RAJA_SUPPRESS_HD_WARN
Definition: macros.hpp:68
Definition: AlignedRangeIndexSetBuilders.cpp:35
Internal header for RAJA forall "BED" macros (i.e., loop bounds 'BED' --> begin, end,...
#define RAJA_EXTRACT_BED_IT(CONTAINER)
Definition: forall.hpp:32
A view of a single object repeated a certain number of times.
Definition: RepeatView.hpp:57
Definition: multi_reduce.hpp:389
RAJA_HOST_DEVICE reference const & operator&=(value_type rhs) const
reducer function; updates the current instance's state
Definition: multi_reduce.hpp:398
value_type get() const
Definition: multi_reduce.hpp:404
RAJA_HOST_DEVICE reference(BaseMultiReduceBitAnd const &base, size_t bin)
Definition: multi_reduce.hpp:391
Definition: multi_reduce.hpp:340
RAJA_HOST_DEVICE reference(BaseMultiReduceBitOr const &base, size_t bin)
Definition: multi_reduce.hpp:342
value_type get() const
Definition: multi_reduce.hpp:355
RAJA_HOST_DEVICE reference const & operator|=(value_type rhs) const
reducer function; updates the current instance's state
Definition: multi_reduce.hpp:349
Definition: multi_reduce.hpp:242
RAJA_HOST_DEVICE reference const & max(value_type rhs) const
reducer function; updates the current instance's state
Definition: multi_reduce.hpp:251
value_type get() const
Definition: multi_reduce.hpp:257
RAJA_HOST_DEVICE reference(BaseMultiReduceMax const &base, size_t bin)
Definition: multi_reduce.hpp:244
Definition: multi_reduce.hpp:193
RAJA_HOST_DEVICE reference const & min(value_type rhs) const
reducer function; updates the current instance's state
Definition: multi_reduce.hpp:202
value_type get() const
Definition: multi_reduce.hpp:208
RAJA_HOST_DEVICE reference(BaseMultiReduceMin const &base, size_t bin)
Definition: multi_reduce.hpp:195
Definition: multi_reduce.hpp:291
RAJA_HOST_DEVICE reference(BaseMultiReduceSum const &base, size_t bin)
Definition: multi_reduce.hpp:293
value_type get() const
Definition: multi_reduce.hpp:306
RAJA_HOST_DEVICE reference const & operator+=(value_type rhs) const
reducer function; updates the current instance's state
Definition: multi_reduce.hpp:300
Definition: multi_reduce.hpp:67
RAJA_SUPPRESS_HD_WARN BaseMultiReduce(BaseMultiReduce &&)=default
void get_all(Container &container) const
Get the calculated reduced value for each bin and store it in container.
Definition: multi_reduce.hpp:146
void reset(Container const &container, value_type identity=MultiReduceOp::identity())
Definition: multi_reduce.hpp:116
void reset()
Definition: multi_reduce.hpp:102
BaseMultiReduce(Container const &container, value_type identity=MultiReduceOp::identity())
Definition: multi_reduce.hpp:88
t_MultiReduceData MultiReduceData
Definition: multi_reduce.hpp:68
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE BaseMultiReduce const & combine(size_t bin, value_type const &other) const
Definition: multi_reduce.hpp:134
value_type get(size_t bin) const
Get the calculated reduced value for a bin.
Definition: multi_reduce.hpp:141
void reset(size_t num_bins, value_type init_val=MultiReduceOp::identity(), value_type identity=MultiReduceOp::identity())
Definition: multi_reduce.hpp:107
typename t_MultiReduceData::value_type value_type
Definition: multi_reduce.hpp:70
BaseMultiReduce()
Definition: multi_reduce.hpp:72
BaseMultiReduce & operator=(BaseMultiReduce const &)=delete
BaseMultiReduce(size_t num_bins, value_type init_val=MultiReduceOp::identity(), value_type identity=MultiReduceOp::identity())
Definition: multi_reduce.hpp:76
RAJA_SUPPRESS_HD_WARN RAJA_HOST_DEVICE size_t size() const
Definition: multi_reduce.hpp:129
RAJA_SUPPRESS_HD_WARN BaseMultiReduce(BaseMultiReduce const &)=default
RAJA_SUPPRESS_HD_WARN ~BaseMultiReduce()=default
typename t_MultiReduceData::MultiReduceOp MultiReduceOp
Definition: multi_reduce.hpp:69
BaseMultiReduce & operator=(BaseMultiReduce &&)=delete
Header file for RAJA type definitions.