kokkos-execution 0.0.1
Loading...
Searching...
No Matches
schedule_from.hpp
Go to the documentation of this file.
1#ifndef KOKKOS_EXECUTION_GRAPH_SCHEDULE_FROM_HPP
2#define KOKKOS_EXECUTION_GRAPH_SCHEDULE_FROM_HPP
3
5
7
15
17
18template <stdexec::receiver Rcvr>
20 Rcvr rcvr;
21
22 KOKKOS_EXECUTION_GET_ENV(Rcvr, this->rcvr)
23};
24
26template <Kokkos::ExecutionSpace Exec, stdexec::sender Sndr, stdexec::receiver Rcvr>
28 : public Impl::Immovable
29 , public ScheduleFromOpStateBase<Rcvr> {
31
32 using execution_space = Exec;
33
35
37 using inner_opstate_t = stdexec::connect_result_t<Sndr, rcvr_t>;
38
40
42
43 ScheduleFromOpState(Sndr&& sndr, Rcvr rcvr) noexcept( // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)
44 stdexec::__nothrow_connectable<Sndr&&, rcvr_t>)
45 : base_t(std::move(rcvr))
46 , inner_opstate(stdexec::connect(std::forward<Sndr>(sndr), rcvr_t{this})) {
47 }
48
49 [[nodiscard]]
50 constexpr auto query(Impl::get_exec_t) const noexcept -> decltype(auto)
51 requires stdexec::__queryable_with<inner_opstate_t, Impl::get_exec_t>
52 {
54 }
55
56 void complete(stdexec::set_value_t) noexcept {
57 stdexec::set_value(std::move(this->rcvr));
58 }
59
60 template <typename Error>
61 void complete(stdexec::set_error_t, Error&& error) noexcept {
62 stdexec::set_error(std::move(this->rcvr), std::forward<Error>(error));
63 }
64
65 void complete(stdexec::set_stopped_t) noexcept {
66 stdexec::set_stopped(std::move(this->rcvr));
67 }
68
69 void start() & noexcept {
70 stdexec::start(inner_opstate);
71 }
72
74 void submit() noexcept requires std::same_as<completion_signal_policy_t, Impl::SubmittedPolicy::OrderOnExec>
75 {
76 std::move(this->rcvr).submitted();
77 }
78
80 void submit() noexcept requires std::same_as<completion_signal_policy_t, Impl::SyncPolicy::InlineFenceExec>
81 {
82 try {
84 .get()
85 .fence(std::string(Impl::dispatch_label<Impl::exec_of_t<decltype(*this)>, ": schedule_from">()));
86 } catch (...) {
87 stdexec::set_error(std::move(this->rcvr), std::current_exception());
88 return;
89 }
90 stdexec::set_value(std::move(this->rcvr));
91 }
92};
93
95template <stdexec::operation_state OpState, Kokkos::ExecutionSpace Exec>
96requires(
97 stdexec::__is_instance_of<OpState, Kokkos::Execution::GraphImpl::ScheduleFromOpState>
98 && std::same_as<typename OpState::execution_space, Exec>)
99struct GraphOperationStateFor<OpState, Exec> : public std::true_type { };
100
102template <typename Exec, typename Sndr>
104 using sender_concept = stdexec::sender_tag;
105
106 using execution_space = Exec;
107
109
110 template <typename Self, typename Rcvr>
112
113 template <typename Self, typename Rcvr>
114 static constexpr bool is_nothrow_connectable_v = std::is_nothrow_constructible_v<
117 Rcvr&&
118 >;
119
120 template <stdexec::__decays_to<ScheduleFromSender> Self, stdexec::receiver Rcvr>
121 STDEXEC_EXPLICIT_THIS_BEGIN(
122 auto connect)(this Self&& self, Rcvr rcvr) // NOLINT(cppcoreguidelines-missing-std-forward)
124 return {std::forward<Self>(self).sndr, std::move(rcvr)};
125 }
126 STDEXEC_EXPLICIT_THIS_END(connect)
127
129
130 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
131};
132
133template <>
134struct TransformSenderFor<stdexec::schedule_from_t> {
135 template <typename Env, stdexec::sender Sndr>
136 requires stdexec::__sends<stdexec::set_value_t, Sndr, Env>
137 auto operator()(const Env&, stdexec::schedule_from_t, stdexec::__ignore, Sndr&& sndr) const
138 noexcept(std::is_nothrow_constructible_v<ScheduleFromSender<Impl::exec_of_t<Sndr, Env>, Sndr>, Sndr&&>) {
140 return ScheduleFromSender<Impl::exec_of_t<Sndr, Env>, Sndr>{.sndr = std::forward<Sndr>(sndr)};
141 } else {
143 }
144 }
145};
146
147} // namespace Kokkos::Execution::GraphImpl
148
149#endif // KOKKOS_EXECUTION_GRAPH_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::GraphImpl::Scheduler.
#define KOKKOS_EXECUTION_GET_ENV(_type_, _obj_)
Retrieve the environment of _obj_. // NOLINTNEXTLINE(cppcoreguidelines-macro-usage).
Definition env.hpp:14
auto no_graph_scheduler_in_env() noexcept
Show a better compile diagnostic when there is no Kokkos::Execution::GraphImpl::Scheduler found.
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.
Operation state for stdexec::schedule_from.
void complete(stdexec::set_value_t) noexcept
ScheduleFromOpState(Sndr &&sndr, Rcvr rcvr) noexcept(//NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved) stdexec::__nothrow_connectable< Sndr &&, rcvr_t >)
Impl::Receiver< ScheduleFromOpState, stdexec::env_of_t< Rcvr > > rcvr_t
void complete(stdexec::set_error_t, Error &&error) noexcept
constexpr auto query(Impl::get_exec_t) const noexcept -> decltype(auto)
void submit() noexcept
Transition to another domain.
stdexec::connect_result_t< Sndr, rcvr_t > inner_opstate_t
void submit() noexcept
Stay in the Kokkos::Execution::GraphImpl::Domain.
void complete(stdexec::set_stopped_t) noexcept
Impl::SubmittedOperationStateTag operation_state_concept
Impl::ScheduleFrom::completion_signal_policy_t< inner_opstate_t, Rcvr > completion_signal_policy_t
ScheduleFromOpState< execution_space, stdexec::__copy_cvref_t< Self, Sndr >, Rcvr > connect_result_t
auto operator()(const Env &, stdexec::schedule_from_t, stdexec::__ignore, Sndr &&sndr) const noexcept(std::is_nothrow_constructible_v< ScheduleFromSender< Impl::exec_of_t< Sndr, Env >, Sndr >, Sndr && >)
Receiver for an object parent_op that implements complete.
Definition receiver.hpp:13
#define KOKKOS_EXECUTION_IMPL_MEMBER_CVREF_T(_Self_, _member_)
Yields the type of member _member_ as accessed from expression _Self_, preserving the cv and ref qual...