kokkos-execution 0.0.1
Loading...
Searching...
No Matches
parallel_reduce.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_GRAPH_PARALLEL_REDUCE_HPP
2#define KOKKOS_EXECUTION_GRAPH_PARALLEL_REDUCE_HPP
3
5
13
15
16template <
17 typename NodeProps,
18 typename Functor,
19 Impl::execution_policy_or_iteration_space ExecPolicyOrIterSpace,
20 typename Reducer
21>
23 using node_props_t = NodeProps;
27
28 template <NodeRef Predecessor>
29 using node_t = decltype(std::declval<const Predecessor&>().then_parallel_reduce(
30 std::declval<node_props_t&&>(),
31 std::declval<policy_t&&>(),
32 std::declval<Functor&&>(),
33 std::declval<Reducer&&>()));
34
36 template <NodeRef Predecessor>
37 auto add_node(const Predecessor& predecessor) && noexcept(false) -> node_t<Predecessor> {
38#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
40#endif
41 auto node = predecessor.then_parallel_reduce(
42 std::move(node_props),
44 std::move(functor),
45 std::move(reducer));
46#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
48 graph_add_node_event(std::move(label), predecessor, node);
49#endif
50 return node;
51 }
52
54 Functor functor;
55 ExecPolicyOrIterSpace policy_or_iter_space;
56 Reducer reducer;
57};
58
59template <
60 stdexec::sender Sndr,
61 typename NodeProps,
62 typename Functor,
64 typename Reducer
65>
80
81template <>
83 template <typename Env, typename Data, typename Sndr>
85 Sndr,
87 typename std::remove_cvref_t<Data>::functor_t,
88 typename std::remove_cvref_t<Data>::policy_or_iter_space_t,
89 typename std::remove_cvref_t<Data>::reducer_t
90 >;
91
92 template <typename Env, typename Data, typename Sndr>
93 requires(stdexec::__sends<stdexec::set_value_t, Sndr, Env> && graph_completing_sender<Sndr, Env>)
95 const Env& env,
97 Data&& data, // NOLINT(cppcoreguidelines-missing-std-forward)
98 Sndr&& sndr) const
99 noexcept(std::is_nothrow_constructible_v<
102 Sndr&&
103 >) {
104 const auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env);
105
107 .clsr =
108 {.node_props = make_node_props(schd.state->exec, std::forward<Data>(data)),
109 .functor = stdexec::__forward_like<Data>(data.functor), // NOLINT(bugprone-use-after-move)
110 .policy_or_iter_space = stdexec::__forward_like<Data>(data.policy_or_iter_space),
111 .reducer = stdexec::__forward_like<Data>(data.reducer)},
112 .sndr = std::forward<Sndr>(sndr)
113 };
114 }
115
116 template <typename Env, typename Data, typename Sndr>
117 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
118 auto operator()(const Env&, Kokkos::Execution::parallel_reduce_t, Data&&, Sndr&&) const noexcept {
120 }
121};
122
123} // namespace Kokkos::Execution::GraphImpl
124
125#endif // KOKKOS_EXECUTION_GRAPH_PARALLEL_REDUCE_HPP
#define KOKKOS_EXECUTION_COMPL_SIGS_ADD(_decayed_self_type_, _sndr_type_,...)
Concept for a sender whose completion scheduler is Kokkos::Execution::GraphImpl::Scheduler.
#define KOKKOS_EXECUTION_IMPL_GRAPH_ADD_NODE_DEBUG_LOGGING(_type_, _node_, _predecessor_)
#define KOKKOS_EXECUTION_GRAPH_OPERATION_STATE_CONNECT
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
void graph_add_node_event(Label &&label, const Predecessor &predecessor, const NodeType &node)
Record an event for a node added after predecessor.
Definition events.hpp:151
decltype(auto) get_label_or_display_string_of(PropsContainer &&props)
If the node properties contain a label, return it. Otherwise, use the display string of T.
decltype(make_node_props(std::declval< const Exec & >(), std::declval< Data && >())) make_node_props_t
constexpr auto make_node_props(const Exec &exec, Data &&data) noexcept(noexcept(Kokkos::Experimental::node_props(Kokkos::Experimental::get_device_handle(exec), Impl::as_convertible_to_string(Impl::get_property< Impl::Label >(std::forward< Data >(data)))))) -> decltype(Kokkos::Experimental::node_props(Kokkos::Experimental::get_device_handle(exec), Impl::as_convertible_to_string(Impl::get_property< Impl::Label >(std::forward< Data >(data)))))
typename ExecOf< T >::type exec_of_t
typename decltype(device_handle_of(std::declval< const T & >()))::type device_handle_of_t
auto no_graph_scheduler_in_env() noexcept
Show a better compile diagnostic when there is no Kokkos::Execution::GraphImpl::Scheduler found.
constexpr make_policy_t< Exec, Properties... > make_policy
std::invoke_result_t< const MakePolicy &, Args... > make_policy_result_t
consteval Impl::Label< std::string_view > label(std::string_view str) noexcept
Definition label.hpp:91
auto add_node(const Predecessor &predecessor) &&noexcept(false) -> node_t< Predecessor >
Impl::make_policy_result_t< Impl::make_policy_t< execution_space >, ExecPolicyOrIterSpace && > policy_t
decltype(std::declval< const Predecessor & >().then_parallel_reduce( std::declval< node_props_t && >(), std::declval< policy_t && >(), std::declval< Functor && >(), std::declval< Reducer && >())) node_t
ParallelReduceClosure< NodeProps, Functor, ExecPolicyOrIterSpace, Reducer > closure_t
ParallelReduceSender< Sndr, make_node_props_t< Impl::exec_of_t< Sndr, Env >, Data >, typename std::remove_cvref_t< Data >::functor_t, typename std::remove_cvref_t< Data >::policy_or_iter_space_t, typename std::remove_cvref_t< Data >::reducer_t > trnsfrmd_sndr_t
auto operator()(const Env &env, Kokkos::Execution::parallel_reduce_t, Data &&data, Sndr &&sndr) const noexcept(std::is_nothrow_constructible_v< trnsfrmd_sndr_t< Env, Data, Sndr >, typename trnsfrmd_sndr_t< Env, Data, Sndr >::closure_t &&, Sndr && >)
auto operator()(const Env &, Kokkos::Execution::parallel_reduce_t, Data &&, Sndr &&) const noexcept
Custom algorithm for the Kokkos::parallel_reduce construct.