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 device_handle = Kokkos::Impl::get_property<device_handle_t>(node_props);
30 auto node = predecessor.then_parallel_for(
31 std::move(node_props), std::forward<ExecPolicy>(policy), std::forward<Functor>(functor));
32 KOKKOS_EXECUTION_IMPL_GRAPH_ADD_NODE_DEBUG_LOGGING("parallel_for", node, predecessor)
33 graph_add_node_event(predecessor, node, device_handle);
34 return node;
35 }
37 Functor functor; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
38 ExecPolicy policy;
39};
40
41template <stdexec::sender Sndr, typename Label, typename Functor, Kokkos::ExecutionPolicy ExecPolicy>
43 using sender_concept = stdexec::sender_tag;
44
46
47 KOKKOS_EXECUTION_COMPL_SIGS_ADD(ParallelForSender, Sndr, stdexec::set_error_t(std::exception_ptr))
48
50
52
54 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
55};
56
57template <>
59 template <typename Env, typename Data, typename Sndr>
61 Sndr,
62 typename std::remove_cvref_t<Data>::label_t,
63 typename std::remove_cvref_t<Data>::functor_t,
64 typename std::remove_cvref_t<Data>::policy_t
65 >;
66
67 template <typename Env, typename Data, typename Sndr>
68 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
70 const Env& env,
72 Data&& data, // NOLINT(cppcoreguidelines-missing-std-forward)
73 Sndr&& sndr) const
74 noexcept(std::is_nothrow_constructible_v<
77 Sndr&&
78 >) {
80 auto& [label, functor, policy] = data;
81
82 auto schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env);
83
85 .clsr =
86 {.node_props = Kokkos::Experimental::node_props(
87 stdexec::__forward_like<Data>(label),
88 Kokkos::Experimental::get_device_handle(schd.state->exec)),
89 .functor = stdexec::__forward_like<Data>(functor),
90 .policy = stdexec::__forward_like<Data>(policy)},
91 .sndr = std::forward<Sndr>(sndr)
92 };
93 } else {
95 }
96 }
97};
98
99} // namespace Kokkos::Execution::GraphImpl
100
101// NOLINTBEGIN(bugprone-reserved-identifier)
102namespace stdexec::__detail {
103template <stdexec::sender Sndr, typename Label, typename Functor, Kokkos::ExecutionPolicy ExecPolicy>
104extern __mtype<Kokkos::Execution::GraphImpl::ParallelForSender<__demangle_t<Sndr>, Label, Functor, ExecPolicy>>
105 __demangle_v<Kokkos::Execution::GraphImpl::ParallelForSender<Sndr, Label, Functor, ExecPolicy>>;
106} // namespace stdexec::__detail
107// NOLINTEND(bugprone-reserved-identifier)
108
109#endif // KOKKOS_EXECUTION_GRAPH_PARALLEL_FOR_HPP
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#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
void graph_add_node_event(const Predecessor &predecessor, const NodeType &node, const Kokkos::Impl::DeviceHandle< Exec > &device_handle)
Record an event for a node added after predecessor.
Definition events.hpp:129
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.