1#ifndef KOKKOS_EXECUTION_GRAPH_PARALLEL_REDUCE_HPP
2#define KOKKOS_EXECUTION_GRAPH_PARALLEL_REDUCE_HPP
19 Impl::execution_policy_or_iteration_space ExecPolicyOrIterSpace,
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&&>()));
36 template <NodeRef Predecessor>
38#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
41 auto node = predecessor.then_parallel_reduce(
46#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
83 template <
typename Env,
typename Data,
typename 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
92 template <
typename Env,
typename Data,
typename Sndr>
99 noexcept(std::is_nothrow_constructible_v<
104 const auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(
sndr), env);
108 {.node_props =
make_node_props(schd.state->exec, std::forward<Data>(data)),
109 .functor = stdexec::__forward_like<Data>(data.functor),
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)
116 template <
typename Env,
typename Data,
typename Sndr>
117 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
#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.
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
exec_of_t< device_handle_t > execution_space
ExecPolicyOrIterSpace policy_or_iter_space
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
device_handle_of_t< NodeProps > device_handle_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
stdexec::sender_tag sender_concept
Custom algorithm for the Kokkos::parallel_reduce construct.