kokkos-execution 0.0.1
Loading...
Searching...
No Matches
parallel_reduce.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_EXECUTION_SPACE_PARALLEL_REDUCE_HPP
2#define KOKKOS_EXECUTION_EXECUTION_SPACE_PARALLEL_REDUCE_HPP
3
5
7
15
17
18template <Kokkos::ExecutionSpace Exec, Impl::parallel_reduce_data Data>
20 using execution_space = Exec;
21
22 void submit() const & {
23 if constexpr (Impl::labeled<Data>) {
24 Kokkos::parallel_reduce(
26 this->get_policy(),
27 data.functor,
28 data.reducer);
29 } else {
30 Kokkos::parallel_reduce(this->get_policy(), data.functor, data.reducer);
31 }
32 }
33
34 [[nodiscard]]
35 auto get_policy() const & noexcept {
36 return Impl::make_policy<execution_space>(state->exec, data.policy_or_iter_space);
37 }
38
40 Data data;
41};
42
43template <typename Tag, stdexec::sender Sndr, Kokkos::ExecutionSpace Exec, Impl::parallel_reduce_data Data>
45 using sender_concept = stdexec::sender_tag;
46
47 using execution_space = Exec;
49
51 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
52
53 KOKKOS_EXECUTION_COMPL_SIGS_ADD(ParallelReduceSender, Sndr, stdexec::set_error_t(std::exception_ptr))
54
55 template <stdexec::receiver Rcvr>
56 constexpr auto connect(Rcvr rcvr) && noexcept(noexcept(make_op_state_t<Sndr, Rcvr, closure_t>{}(
57 std::declval<Sndr>(),
58 std::declval<Rcvr>(),
59 std::declval<closure_t>()))) -> op_state_t<Sndr, Rcvr, closure_t> {
60 return make_op_state_t<Sndr, Rcvr, closure_t>{}(std::forward<Sndr>(sndr), std::move(rcvr), std::move(clsr));
61 }
62
64};
65
66template <>
68 template <typename Env, typename Data, typename Sndr>
71
72 template <typename Env, typename Data, typename Sndr>
73 requires(stdexec::__sends<stdexec::set_value_t, Sndr, Env> && execution_space_completing_sender<Sndr, Env>)
74 auto operator()(
75 const Env& env,
77 Data&& data, // NOLINT(cppcoreguidelines-missing-std-forward)
78 Sndr&& sndr) const
79 STDEXEC_AUTO_RETURN(
81 {.state = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env).state,
82 .data = std::forward<Data>(data)},
83 std::forward<Sndr>(sndr)
84 })
85
86 template <typename Env, typename Data, typename Sndr>
87 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
88 auto operator()(const Env&, Kokkos::Execution::parallel_reduce_t, Data&&, Sndr&&) const noexcept {
90 }
91};
92
93} // namespace Kokkos::Execution::ExecutionSpaceImpl
94
95#endif // KOKKOS_EXECUTION_EXECUTION_SPACE_PARALLEL_REDUCE_HPP
#define KOKKOS_EXECUTION_COMPL_SIGS_ADD(_decayed_self_type_, _sndr_type_,...)
Concept for a sender whose completion scheduler is Kokkos::Execution::ExecutionSpaceImpl::Scheduler.
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
auto no_execution_space_scheduler_in_env() noexcept
Show a better compile diagnostic when there is no Kokkos::Execution::ExecutionSpaceImpl::Scheduler fo...
typename make_op_state_t< Sndr, Rcvr, Clsrs... >::type op_state_t
Impl::MakeOpState< Domain, OpState >::Huddle< Sndr, Rcvr, Clsrs... > make_op_state_t
constexpr make_policy_t< Exec, Properties... > make_policy
constexpr auto as_convertible_to_string(T &&value) noexcept(noexcept(std::forward< T >(value))) -> decltype(std::forward< T >(value))
Convert to a value usable as a std::string.
Definition label.hpp:75
constexpr decltype(auto) get_property(Data &&data) noexcept
constexpr auto connect(Rcvr rcvr) &&noexcept(noexcept(make_op_state_t< Sndr, Rcvr, closure_t >{}(std::declval< Sndr >(), std::declval< Rcvr >(), std::declval< closure_t >()))) -> op_state_t< Sndr, Rcvr, closure_t >
ParallelReduceClosure< execution_space, Data > closure_t
ParallelReduceSender< parallel_reduce_t, Sndr, Impl::exec_of_t< Sndr, Env >, std::remove_cvref_t< Data > > trnsfrmd_sndr_t
Custom algorithm for the Kokkos::parallel_reduce construct.