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
11
13
14template <typename Label, typename Functor, Kokkos::ExecutionPolicy ExecPolicy>
16 using execution_space = typename ExecPolicy::execution_space;
17 using device_handle_t = Kokkos::Impl::DeviceHandle<execution_space>;
18 using node_props_t = typename Kokkos::Impl::NodeCtorProps<Label, device_handle_t>::uniform_type;
19
20 template <NodeRef Predecessor>
21 using node_t = decltype(std::declval<const Predecessor&>().then_parallel_for(
22 std::declval<node_props_t&&>(),
23 std::declval<ExecPolicy&&>(),
24 std::declval<Functor&&>()));
25
27 template <NodeRef Predecessor>
28 auto add_node(const Predecessor& predecessor) && noexcept(false) -> node_t<Predecessor> {
29 auto node = predecessor.then_parallel_for(
30 std::move(node_props), std::forward<ExecPolicy>(policy), std::forward<Functor>(functor));
31 KOKKOS_EXECUTION_IMPL_GRAPH_ADD_NODE_DEBUG_LOGGING("parallel_for", node, predecessor)
32 graph_add_node_event(predecessor, node);
33 return node;
34 }
36 Functor functor; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
37 ExecPolicy policy;
38};
39
40template <stdexec::sender Sndr, typename Label, typename Functor, Kokkos::ExecutionPolicy ExecPolicy>
42 using sender_concept = stdexec::sender_tag;
43
45
46 KOKKOS_EXECUTION_COMPL_SIGS_ADD(ParallelForSender, stdexec::set_error_t(std::exception_ptr))
47
49
51
53 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
54};
55
56template <>
58 template <typename Env, typename Data, typename Sndr>
60 Sndr,
61 typename std::remove_cvref_t<Data>::label_t,
62 typename std::remove_cvref_t<Data>::functor_t,
63 typename std::remove_cvref_t<Data>::policy_t
64 >;
65
66 template <typename Env, typename Data, typename Sndr>
67 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
69 const Env& env,
71 Data&& data, // NOLINT(cppcoreguidelines-missing-std-forward)
72 Sndr&& sndr) const
73 noexcept(std::is_nothrow_constructible_v<
76 Sndr&&
77 >) {
79 auto& [label, functor, policy] = data;
80
81 auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env);
82
84 .clsr =
85 {.node_props = Kokkos::Experimental::node_props(
86 stdexec::__forward_like<Data>(label),
87 Kokkos::Experimental::get_device_handle(schd.state->exec)),
88 .functor = stdexec::__forward_like<Data>(functor),
89 .policy = stdexec::__forward_like<Data>(policy)},
90 .sndr = std::forward<Sndr>(sndr)
91 };
92 } else {
94 }
95 }
96};
97
98} // namespace Kokkos::Execution::GraphImpl
99
100// NOLINTBEGIN(bugprone-reserved-identifier)
102template <stdexec::sender Sndr, typename Label, typename Functor, Kokkos::ExecutionPolicy ExecPolicy>
103extern __mtype<Kokkos::Execution::GraphImpl::ParallelForSender<__demangle_t<Sndr>, Label, Functor, ExecPolicy>>
104 __demangle_v<Kokkos::Execution::GraphImpl::ParallelForSender<Sndr, Label, Functor, ExecPolicy>>;
105} // namespace stdexec::__detail
106// NOLINTEND(bugprone-reserved-identifier)
107
108#endif // KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#define KOKKOS_EXECUTION_COMPL_SIGS_ADD(_sndr_type_,...)
Completion signatures of _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
void graph_add_node_event(const Predecessor &predecessor, const NodeType &node)
Record an event for a node added after predecessor.
Definition events.hpp:112
auto no_graph_scheduler_in_env() noexcept
Show a better compile diagnostic when there is no Kokkos::Execution::GraphImpl::Scheduler found.
typename ExecPolicy::execution_space execution_space
typename Kokkos::Impl::NodeCtorProps< Label, device_handle_t >::uniform_type node_props_t
Kokkos::Impl::DeviceHandle< execution_space > device_handle_t
decltype(std::declval< const Predecessor & >().then_parallel_for( std::declval< node_props_t && >(), std::declval< ExecPolicy && >(), std::declval< Functor && >())) node_t
auto add_node(const Predecessor &predecessor) &&noexcept(false) -> node_t< Predecessor >
ParallelForSender< Sndr, typename std::remove_cvref_t< Data >::label_t, typename std::remove_cvref_t< Data >::functor_t, typename std::remove_cvref_t< Data >::policy_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.