kokkos-execution 0.0.1
Loading...
Searching...
No Matches
schedule_from.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_EXECUTION_SPACE_SCHEDULE_FROM_HPP
2#define KOKKOS_EXECUTION_EXECUTION_SPACE_SCHEDULE_FROM_HPP
3
5
7
17
19
20template <typename ParentOp, typename Env = stdexec::env_of_t<ParentOp>>
21struct ScheduleFromReceiver : public Impl::Receiver<ParentOp, Env> {
22 using exec_env_policy_t = typename ParentOp::exec_env_policy_t;
23
24 [[nodiscard]]
25 constexpr auto get_env() const noexcept -> extend_env_with_exec_t<exec_env_policy_t, Env> {
26 return extend_env_with_exec<exec_env_policy_t>(stdexec::get_env(*this->parent_op));
27 }
28};
29
30template <stdexec::receiver Rcvr>
32 Rcvr rcvr;
33
34 KOKKOS_EXECUTION_GET_ENV(Rcvr, this->rcvr)
35};
36
37template <stdexec::sender Sndr, stdexec::receiver Rcvr>
39 : public Impl::Immovable
40 , public ScheduleFromOpStateBase<Rcvr> {
42
44
45 using exec_env_policy_t = std::conditional_t<
49 >;
50
52
53 using inner_opstate_t = stdexec::connect_result_t<Sndr, rcvr_t>;
54
56
58
59 constexpr explicit ScheduleFromOpState(
60 Sndr&& sndr, // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
61 Rcvr rcvr)
62 noexcept(std::is_nothrow_constructible_v<base_t, Rcvr&&> && stdexec::__nothrow_connectable<Sndr&&, rcvr_t>)
63 : base_t(std::move(rcvr))
64 , inner_opstate(stdexec::connect(std::forward<Sndr>(sndr), rcvr_t{this})) {
65 }
66
67 void complete(stdexec::set_value_t) noexcept {
68 stdexec::set_value(std::move(this->rcvr));
69 }
70
71 template <typename Error>
72 void complete(stdexec::set_error_t, Error&& error) noexcept {
73 stdexec::set_error(std::move(this->rcvr), std::forward<Error>(error));
74 }
75
76 void complete(stdexec::set_stopped_t) noexcept {
77 stdexec::set_stopped(std::move(this->rcvr));
78 }
79
81 void submit() noexcept requires std::same_as<completion_signal_policy_t, Impl::SubmittedPolicy::OrderOnExec>
82 {
83 std::move(this->rcvr).submitted();
84 }
85
87 void submit() noexcept requires std::same_as<completion_signal_policy_t, Impl::SyncPolicy::InlineFenceExec>
88 {
89 try {
91 .get()
92 .fence(std::string(Impl::dispatch_label<Impl::exec_of_t<decltype(*this)>, ": schedule_from">()));
93 } catch (...) {
94 stdexec::set_error(std::move(this->rcvr), std::current_exception());
95 return;
96 }
97 stdexec::set_value(std::move(this->rcvr));
98 }
99
100 [[nodiscard]]
101 constexpr auto query(Impl::get_exec_t) const noexcept -> decltype(auto)
102 requires stdexec::__queryable_with<inner_opstate_t, Impl::get_exec_t>
103 {
105 }
106
107 void start() & noexcept {
108 stdexec::start(inner_opstate);
109 }
110};
111
112template <stdexec::sender Sndr>
114 using sender_concept = stdexec::sender_tag;
115
117
118 template <stdexec::receiver Rcvr>
119 constexpr auto
120 connect(Rcvr rcvr) && noexcept(std::is_nothrow_constructible_v<ScheduleFromOpState<Sndr, Rcvr>, Sndr&&, Rcvr&&>)
122 return ScheduleFromOpState<Sndr, Rcvr>{std::forward<Sndr>(sndr), std::move(rcvr)};
123 }
124
126
127 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
128};
129
130template <>
131struct TransformSenderFor<stdexec::schedule_from_t> {
132 template <typename Env, typename Sndr>
133 auto operator()(const Env&, stdexec::schedule_from_t, stdexec::__ignore, Sndr&& sndr) const
134 noexcept(std::is_nothrow_constructible_v<ScheduleFromSender<Sndr>, Sndr&&>) -> ScheduleFromSender<Sndr> {
135 return {.sndr = std::forward<Sndr>(sndr)};
136 }
137};
138
139} // namespace Kokkos::Execution::ExecutionSpaceImpl
140
141#endif // KOKKOS_EXECUTION_EXECUTION_SPACE_SCHEDULE_FROM_HPP
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#define KOKKOS_EXECUTION_COMPL_SIGS_KEEP(_decayed_self_type_, _sndr_type_)
Concept for a sender whose completion scheduler is Kokkos::Execution::ExecutionSpaceImpl::Scheduler.
#define KOKKOS_EXECUTION_GET_ENV(_type_, _obj_)
Retrieve the environment of _obj_. // NOLINTNEXTLINE(cppcoreguidelines-macro-usage).
Definition env.hpp:14
decltype(extend_env_with_exec< ExecEnvPolicy >(std::declval< Env >())) extend_env_with_exec_t
Definition env.hpp:51
std::conditional_t< stdexec::__queryable_with< Env, Impl::get_exec_t >, WithExecEnvPolicy, WithoutExecEnvPolicy > extend_env_with_exec_policy_t
If Env is queryable with Impl::get_exec_t, use WithExecEnvPolicy.
Definition env.hpp:55
constexpr auto extend_env_with_exec(Env &&env) noexcept
Definition env.hpp:40
std::conditional_t< ScheduleFrom::signals_submitted< InnerOp, Rcvr >, Impl::SubmittedPolicy::OrderOnExec, Impl::SyncPolicy::InlineFenceExec > completion_signal_policy_t
constexpr get_exec_t get_exec
Definition get_exec.hpp:19
typename ExecOf< Args... >::type exec_of_t
Definition get_exec.hpp:37
consteval std::string_view dispatch_label() noexcept
View the dispatch label as a std::string_view.
ScheduleFromReceiver< ScheduleFromOpState, stdexec::env_of_t< Rcvr > > rcvr_t
void submit() noexcept
Transition to another domain.
Impl::ScheduleFrom::completion_signal_policy_t< inner_opstate_t, Rcvr > completion_signal_policy_t
stdexec::connect_result_t< Sndr, rcvr_t > inner_opstate_t
void submit() noexcept
Stay in the Kokkos::Execution::ExecutionSpaceImpl::Domain.
constexpr ScheduleFromOpState(Sndr &&sndr, Rcvr rcvr) noexcept(std::is_nothrow_constructible_v< base_t, Rcvr && > &&stdexec::__nothrow_connectable< Sndr &&, rcvr_t >)
void complete(stdexec::set_error_t, Error &&error) noexcept
std::conditional_t< execution_space_completing_sender< Sndr, stdexec::__fwd_env_t< stdexec::env_of_t< Rcvr > > >, WithoutExecEnvPolicy, extend_env_with_exec_policy_t< stdexec::env_of_t< Rcvr > > > exec_env_policy_t
constexpr auto query(Impl::get_exec_t) const noexcept -> decltype(auto)
constexpr auto get_env() const noexcept -> extend_env_with_exec_t< exec_env_policy_t, Env >
constexpr auto connect(Rcvr rcvr) &&noexcept(std::is_nothrow_constructible_v< ScheduleFromOpState< Sndr, Rcvr >, Sndr &&, Rcvr && >) -> ScheduleFromOpState< Sndr, Rcvr >
auto operator()(const Env &, stdexec::schedule_from_t, stdexec::__ignore, Sndr &&sndr) const noexcept(std::is_nothrow_constructible_v< ScheduleFromSender< Sndr >, Sndr && >) -> ScheduleFromSender< Sndr >
Receiver for an object parent_op that implements complete.
Definition receiver.hpp:13