1#ifndef KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
2#define KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
17template <
typename NodeProps,
typename Functor, Impl::execution_policy_or_iteration_space ExecPolicyOrIterSpace>
24 template <NodeRef Predecessor>
25 using node_t =
decltype(std::declval<const Predecessor&>().then_parallel_for(
26 std::declval<node_props_t&&>(),
27 std::declval<policy_t&&>(),
28 std::declval<Functor&&>()));
31 template <NodeRef Predecessor>
33#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
36 auto node = predecessor.then_parallel_for(
40#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
75 template <
typename Env,
typename Data,
typename Sndr>
79 typename std::remove_cvref_t<Data>::functor_t,
80 typename std::remove_cvref_t<Data>::policy_or_iter_space_t
83 template <
typename Env,
typename Data,
typename Sndr>
90 noexcept(std::is_nothrow_constructible_v<
95 const auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(
sndr), env);
99 {.node_props =
make_node_props(schd.state->exec, std::forward<Data>(data)),
100 .functor = stdexec::__forward_like<Data>(data.functor),
101 .policy_or_iter_space = stdexec::__forward_like<Data>(data.policy_or_iter_space)},
102 .sndr = std::forward<Sndr>(
sndr)
106 template <
typename Env,
typename Data,
typename Sndr>
107 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
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
exec_of_t< device_handle_t > execution_space
decltype(std::declval< const Predecessor & >().then_parallel_for( std::declval< node_props_t && >(), std::declval< policy_t && >(), std::declval< Functor && >())) node_t
ExecPolicyOrIterSpace policy_or_iter_space
stdexec::sender_tag sender_concept
ParallelForClosure< node_props_t< Impl::exec_of_t< Sndr, Env >, std::string >, Impl::functor_for_bulk_t< Data >, ExecPolicyOrIterSpace > closure_t
Custom algorithm for the Kokkos::parallel_for construct.