1#ifndef KOKKOS_EXECUTION_PARALLEL_REDUCE_HPP
2#define KOKKOS_EXECUTION_PARALLEL_REDUCE_HPP
4#include "Kokkos_Macros.hpp"
5#ifdef KOKKOS_ENABLE_EXPERIMENTAL_CXX20_MODULES
6import kokkos.core_impl;
21template <
typename Data>
23 typename Data::functor_t;
24 typename Data::policy_or_iter_space_t;
25 typename Data::reducer_t;
26 typename Data::properties_t;
29 requires stdexec::__is_instance_of<typename Data::properties_t, properties>;
30 requires requires(
const Data& data) {
31 { data.functor } -> std::same_as<const typename Data::functor_t&>;
32 { data.policy_or_iter_space } -> std::same_as<const typename Data::policy_or_iter_space_t&>;
33 { data.reducer } -> std::same_as<const typename Data::reducer_t&>;
41 typename... Properties
45template <stdexec::sender Sndr, parallel_reduce_data Data>
52 template <
typename Label,
typename Functor,
typename ExecPolicy,
typename Reducer>
55 operator()(Label&&
label, ExecPolicy&& policy, Functor&& functor, Reducer&& reducer)
const STDEXEC_AUTO_RETURN(
58 std::forward<ExecPolicy>(policy),
59 std::forward<Functor>(functor),
60 std::forward<Reducer>(reducer),
63 template <typename ExecPolicyOrIterSpace, typename Functor, typename Reducer>
65 constexpr auto operator()(ExecPolicyOrIterSpace&& policy_or_iter_space, Functor&& functor, Reducer&& reducer)
const
69 std::forward<ExecPolicyOrIterSpace>(policy_or_iter_space),
70 std::forward<Functor>(functor),
71 std::forward<Reducer>(reducer)))
73 template <
typename Label,
typename Functor, std::
integral T,
typename Reducer>
76 operator()(Label&&
label,
const T work_count, Functor&& functor, Reducer&& reducer)
const STDEXEC_AUTO_RETURN(
80 std::forward<Functor>(functor),
81 std::forward<Reducer>(reducer),
84 template <typename Functor, std::integral T, typename Reducer>
85 constexpr auto operator()(
const T work_count, Functor&& functor, Reducer&& reducer)
const STDEXEC_AUTO_RETURN(
89 std::forward<Functor>(functor),
90 std::forward<Reducer>(reducer)))
92 template <
typename Functor,
typename ExecPolicyOrIterSpace,
typename Reducer,
typename... Properties>
94 std::remove_cvref_t<Functor>,
95 std::remove_cvref_t<ExecPolicyOrIterSpace>,
96 std::remove_cvref_t<Reducer>,
97 std::remove_cvref_t<Properties>...
101 stdexec::sender Sndr,
103 typename ExecPolicyOrIterSpace,
105 typename... Properties
110 ExecPolicyOrIterSpace&& policy_or_iter_space,
113 Properties&&... properties)
const
122 std::forward<Properties>(properties)...,
123 std::forward<Functor>(functor),
124 std::forward<ExecPolicyOrIterSpace>(policy_or_iter_space),
125 std::forward<Reducer>(reducer)},
126 std::forward<Sndr>(sndr)
134 execution_policy_or_iteration_space ExecPolicyOrIterSpace,
136 typename... Properties
149 template <
typename Self,
typename UnaryOp>
157 std::invoke_result_t<UnaryOp,
decltype(stdexec::__forward_like<Self>(self.policy_or_iter_space))>
161 >{stdexec::__forward_like<Self>(detail::as_base<Properties>(self))...,
162 stdexec::__forward_like<Self>(self.functor),
163 std::forward<UnaryOp>(unary_op)(stdexec::__forward_like<Self>(self.policy_or_iter_space)),
164 stdexec::__forward_like<Self>(self.reducer)})
168template <stdexec::sender Sndr, Impl::parallel_reduce_data Data>
178 using base_t = stdexec::__tuple<parallel_reduce_t, __data_t, Sndr>;
182 template <stdexec::receiver Rcvr>
185 template <stdexec::receiver Rcvr>
186 constexpr auto connect(Rcvr)
const & =
delete;
191 stdexec::__get<idx_sndr>(
static_cast<const base_t&
>(*
this)))
#define KOKKOS_EXECUTION_COMPL_SIGS_ADD(_decayed_self_type_, _sndr_type_,...)
Constrain the accepted label types.
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#define KOKKOS_EXECUTION_RETURNS_BRACED(_type_,...)
Define a function by returning a list-initialized object of an explicit type.
constexpr auto make_iter_space(const T work_count) noexcept -> Kokkos::dims< 1, T >
Make a valid iteration space from a work count.
consteval Impl::Label< std::string_view > label(std::string_view str) noexcept
constexpr parallel_reduce_t parallel_reduce
ExecPolicyOrIterSpace policy_or_iter_space_t
policy_or_iter_space_t policy_or_iter_space
constexpr auto transform_policy_or_iter_space(this Self &&self, UnaryOp &&unary_op) noexcept(noexcept(ParallelReduceData< functor_t, std::remove_cvref_t< std::invoke_result_t< UnaryOp, decltype(stdexec::__forward_like< Self >(self.policy_or_iter_space))> >, reducer_t, Properties... >{stdexec::__forward_like< Self >(detail::as_base< Properties >(self))..., stdexec::__forward_like< Self >(self.functor), std::forward< UnaryOp >(unary_op)(stdexec::__forward_like< Self >(self.policy_or_iter_space)), stdexec::__forward_like< Self >(self.reducer)})) -> decltype(ParallelReduceData< functor_t, std::remove_cvref_t< std::invoke_result_t< UnaryOp, decltype(stdexec::__forward_like< Self >(self.policy_or_iter_space))> >, reducer_t, Properties... >{stdexec::__forward_like< Self >(detail::as_base< Properties >(self))..., stdexec::__forward_like< Self >(self.functor), std::forward< UnaryOp >(unary_op)(stdexec::__forward_like< Self >(self.policy_or_iter_space)), stdexec::__forward_like< Self >(self.reducer)})
properties< Properties... > properties_t
static constexpr size_t idx_sndr
stdexec::__tuple< parallel_reduce_t, __data_t, Sndr > base_t
constexpr auto connect(Rcvr) const &=delete
stdexec::__mlist< Sndr > __children_t
constexpr auto connect(Rcvr) &&=delete
stdexec::sender_tag sender_concept
Custom algorithm for the Kokkos::parallel_reduce construct.
constexpr auto operator()(Label &&label, const T work_count, Functor &&functor, Reducer &&reducer) const noexcept(noexcept(stdexec::__closure(*this, Impl::make_iter_space(work_count), std::forward< Functor >(functor), std::forward< Reducer >(reducer), Impl::Label{std::forward< Label >(label)}))) -> decltype(stdexec::__closure(*this, Impl::make_iter_space(work_count), std::forward< Functor >(functor), std::forward< Reducer >(reducer), Impl::Label{std::forward< Label >(label)}))
constexpr auto operator()(Sndr &&sndr, ExecPolicyOrIterSpace &&policy_or_iter_space, Functor &&functor, Reducer &&reducer, Properties &&... properties) const noexcept(noexcept(Impl::ParallelReduceSender< Sndr, parallel_reduce_data_t< Functor, ExecPolicyOrIterSpace, Reducer, Properties... > >{{ parallel_reduce_t{}, parallel_reduce_data_t< Functor, ExecPolicyOrIterSpace, Reducer, Properties... >{ std::forward< Properties >(properties)..., std::forward< Functor >(functor), std::forward< ExecPolicyOrIterSpace >(policy_or_iter_space), std::forward< Reducer >(reducer)}, std::forward< Sndr >(sndr) }})) -> Impl::ParallelReduceSender< Sndr, parallel_reduce_data_t< Functor, ExecPolicyOrIterSpace, Reducer, Properties... > >
Impl::ParallelReduceData< std::remove_cvref_t< Functor >, std::remove_cvref_t< ExecPolicyOrIterSpace >, std::remove_cvref_t< Reducer >, std::remove_cvref_t< Properties >... > parallel_reduce_data_t