kokkos-execution 0.0.1
Loading...
Searching...
No Matches
parallel_for.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
2#define KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
3
5
14
16
17template <typename NodeProps, typename Functor, Impl::execution_policy_or_iteration_space ExecPolicyOrIterSpace>
19 using node_props_t = NodeProps;
23
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&&>()));
29
31 template <NodeRef Predecessor>
32 auto add_node(const Predecessor& predecessor) && noexcept(false) -> node_t<Predecessor> {
33#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
35#endif
36 auto node = predecessor.then_parallel_for(
37 std::move(node_props),
39 std::move(functor));
40#if defined(KOKKOS_EXECUTION_ENABLE_EVENT_DISPATCH) || defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
42 graph_add_node_event(std::move(label), predecessor, node);
43#endif
44 return node;
45 }
46
48 Functor functor;
49 ExecPolicyOrIterSpace policy_or_iter_space;
50};
51
52template <
53 stdexec::sender Sndr,
54 typename NodeProps,
55 typename Functor,
57>
59 using sender_concept = stdexec::sender_tag;
60
62
63 KOKKOS_EXECUTION_COMPL_SIGS_ADD(ParallelForSender, Sndr, stdexec::set_error_t(std::exception_ptr))
64
66
68
70 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
71};
72
73template <>
75 template <typename Env, typename Data, typename Sndr>
77 Sndr,
79 typename std::remove_cvref_t<Data>::functor_t,
80 typename std::remove_cvref_t<Data>::policy_or_iter_space_t
81 >;
82
83 template <typename Env, typename Data, typename Sndr>
84 requires(stdexec::__sends<stdexec::set_value_t, Sndr, Env> && graph_completing_sender<Sndr, Env>)
86 const Env& env,
88 Data&& data, // NOLINT(cppcoreguidelines-missing-std-forward)
89 Sndr&& sndr) const
90 noexcept(std::is_nothrow_constructible_v<
93 Sndr&&
94 >) {
95 const auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env);
96
98 .clsr =
99 {.node_props = make_node_props(schd.state->exec, std::forward<Data>(data)),
100 .functor = stdexec::__forward_like<Data>(data.functor), // NOLINT(bugprone-use-after-move)
101 .policy_or_iter_space = stdexec::__forward_like<Data>(data.policy_or_iter_space)},
102 .sndr = std::forward<Sndr>(sndr)
103 };
104 }
105
106 template <typename Env, typename Data, typename Sndr>
107 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
108 auto operator()(const Env&, Kokkos::Execution::parallel_for_t, Data&&, Sndr&&) const noexcept {
110 }
111};
112
113} // namespace Kokkos::Execution::GraphImpl
114
115#endif // KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_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
device_handle_of_t< NodeProps > device_handle_t
decltype(std::declval< const Predecessor & >().then_parallel_for( std::declval< node_props_t && >(), std::declval< policy_t && >(), std::declval< Functor && >())) node_t
auto operator()(const Env &, Kokkos::Execution::parallel_for_t, Data &&, Sndr &&) const noexcept
ParallelForSender< 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 > trnsfrmd_sndr_t
auto operator()(const Env &env, Kokkos::Execution::parallel_for_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 && >)
Custom algorithm for the Kokkos::parallel_for construct.