23 #ifndef RAJA_omp_reduce_HPP
24 #define RAJA_omp_reduce_HPP
26 #include "RAJA/config.hpp"
28 #if defined(RAJA_ENABLE_OPENMP)
47 template<
typename T,
typename Reduce>
49 :
public reduce::detail::BaseCombinable<T, Reduce, ReduceOMP<T, Reduce>>
51 using Base = reduce::detail::BaseCombinable<T, Reduce, ReduceOMP>;
62 #pragma omp critical(ompReduceCritical)
63 Reduce()(Base::parent->local(), Base::my_data);
64 Base::my_data = Base::identity;
81 template<
typename T,
typename Reduce>
82 class ReduceOMPOrdered
83 :
public reduce::detail::
84 BaseCombinable<T, Reduce, ReduceOMPOrdered<T, Reduce>>
86 using Base = reduce::detail::BaseCombinable<T, Reduce, ReduceOMPOrdered>;
87 std::shared_ptr<std::vector<T>> data;
90 ReduceOMPOrdered() { reset(T(), T()); }
93 explicit ReduceOMPOrdered(T init_val, T identity_)
95 reset(init_val, identity_);
98 void reset(T init_val, T identity_)
100 Base::reset(init_val, identity_);
101 data = std::shared_ptr<std::vector<T>>(
102 std::make_shared<std::vector<T>>(omp_get_max_threads(), identity_));
107 Reduce {}((*data)[omp_get_thread_num()], Base::my_data);
108 Base::my_data = Base::identity;
111 T get_combined()
const
113 if (Base::my_data != Base::identity)
115 Reduce {}((*data)[omp_get_thread_num()], Base::my_data);
116 Base::my_data = Base::identity;
119 T res = Base::identity;
120 for (
size_t i = 0; i < data->size(); ++i)
122 Reduce {}(res, (*data)[i]);
constexpr auto Reduce(T *target)
Definition: reducer.hpp:231
Definition: AlignedRangeIndexSetBuilders.cpp:35
Header file containing RAJA OpenMP policy definitions.
Base types used in common for RAJA reducer objects.
#define RAJA_DECLARE_ALL_REDUCERS(POL, COMBINER)
Definition: reduce.hpp:46
Header file providing RAJA reduction declarations.
Header file for RAJA type definitions.