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
14
16
19
21template <stdexec::scheduler Schd, stdexec::receiver Rcvr>
24
25 Schd schd;
26 Rcvr rcvr;
27
28 void set_value() && noexcept {
29 stdexec::set_value(std::move(rcvr));
30 }
31
32 void continues_after() && noexcept {
35 const bool requires_synchronization = [&]() {
36 if constexpr (stdexec::__queryable_with<stdexec::env_of_t<Rcvr>, Impl::get_exec_t>) {
37 if constexpr (
38 std::same_as<
39 typename std::remove_cvref_t<
40 stdexec::__query_result_t<stdexec::env_of_t<Rcvr>, Impl::get_exec_t>
42 typename Schd::execution_space
43 >) {
44 return Impl::get_exec(stdexec::get_env(rcvr)).get() != schd.state->exec;
45 }
46 }
47 return true;
48 }();
49 if (requires_synchronization) {
50 schd.state->exec.fence(
51 std::format("{}: schedule_from", Kokkos::Impl::TypeInfo<typename Schd::execution_space>::name()));
52 }
53 stdexec::set_value(std::move(rcvr));
54 }
55
56 template <typename Error>
57 void set_error(Error&& err) && noexcept {
58 stdexec::set_error(std::move(rcvr), std::forward<Error>(err));
59 }
60
61 void set_stopped() && noexcept {
62 stdexec::set_stopped(std::move(rcvr));
63 }
64
66};
67
68template <typename ExecEnvPolicy, typename Rcvr>
70 using receiver_concept = stdexec::receiver_tag;
71
72 Rcvr rcvr;
73
74 void set_value() && noexcept {
75 stdexec::set_value(std::move(rcvr));
76 }
77
78 template <typename Error>
79 void set_error(Error&& err) && noexcept {
80 stdexec::set_error(std::move(rcvr), std::forward<Error>(err));
81 }
82
83 void set_stopped() && noexcept {
84 stdexec::set_stopped(std::move(rcvr));
85 }
86
87 [[nodiscard]]
88 constexpr auto get_env() const noexcept -> extend_env_t<ExecEnvPolicy, stdexec::env_of_t<Rcvr>> {
89 return extend_env<ExecEnvPolicy>(stdexec::get_env(this->rcvr));
90 }
91};
92
93template <typename...>
95
97template <stdexec::scheduler Schd, stdexec::sender Sndr>
99 using sender_concept = stdexec::sender_tag;
100
102
103 template <typename Rcvr>
105
106 template <stdexec::receiver Rcvr>
107 stdexec::operation_state auto connect(Rcvr rcvr) && noexcept(
108 std::is_nothrow_constructible_v<rcvr_t<Rcvr>, Schd&&, Rcvr&&>
109 && stdexec::__nothrow_connectable<Sndr&&, rcvr_t<Rcvr>>) {
110 return stdexec::connect(
111 std::forward<Sndr>(sndr), rcvr_t<Rcvr>{.schd = std::move(schd), .rcvr = std::move(rcvr)});
112 }
113
115
116 Schd schd;
117 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
118};
119
120template <stdexec::sender Sndr>
122 using sender_concept = stdexec::sender_tag;
123
125
126 template <typename Rcvr>
128
129 template <stdexec::receiver Rcvr>
130 stdexec::operation_state auto connect(Rcvr rcvr) && noexcept(
131 std::is_nothrow_constructible_v<rcvr_t<Rcvr>, Rcvr&&> && stdexec::__nothrow_connectable<Sndr&&, rcvr_t<Rcvr>>) {
132 return stdexec::connect(std::forward<Sndr>(sndr), rcvr_t<Rcvr>{std::move(rcvr)});
133 }
134
136
137 Sndr sndr; // NOLINT(cppcoreguidelines-avoid-const-or-ref-data-members)
138};
139
140template <>
141struct TransformSenderFor<stdexec::schedule_from_t> {
142 template <typename Sndr, typename Env>
144
145 template <typename Env, execution_space_completing_sender<Env> Sndr>
146 auto operator()(const Env& env, stdexec::schedule_from_t, stdexec::__ignore, Sndr&& sndr) const
147 noexcept(std::is_nothrow_constructible_v<
150 Sndr&&
151 >) {
152
154 .schd = stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(sndr), env),
155 .sndr = std::forward<Sndr>(sndr)};
156 }
157
158 template <typename Env, typename Sndr>
159 requires(!stdexec::__has_completion_scheduler_for<stdexec::set_value_t, Sndr, Env>)
160 auto operator()(const Env&, stdexec::schedule_from_t, stdexec::__ignore, Sndr&& sndr) const
161 noexcept(std::is_nothrow_constructible_v<ScheduleFromSender<WithoutDelegatedSyncPolicy, Sndr>, Sndr&&>) {
162 return ScheduleFromSender<WithoutDelegatedSyncPolicy, Sndr>{.sndr = std::forward<Sndr>(sndr)};
163 }
164};
165
166} // namespace Kokkos::Execution::ExecutionSpaceImpl
167
168#endif // KOKKOS_EXECUTION_EXECUTION_SPACE_SCHEDULE_FROM_HPP
#define KOKKOS_EXECUTION_IMPL_FORWARDING_ATTRIBUTES_GET_ENV(_type_, _obj_)
#define KOKKOS_EXECUTION_COMPL_SIGS_KEEP(_sndr_type_)
#define KOKKOS_EXECUTION_FORWARDING_GET_ENV(_type_, _obj_)
Retrieve the environment of _obj_ (with forwarding). // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)...
Definition env.hpp:7
decltype(extend_env< ExecEnvPolicy >(std::declval< Env >())) extend_env_t
Definition env.hpp:51
constexpr auto extend_env(Env &&env) noexcept
Definition env.hpp:40
constexpr get_exec_t get_exec
Definition get_exec.hpp:17
std::invoke_result_t< stdexec::get_completion_scheduler_t< Tag >, stdexec::env_of_t< Sndr >, Env... > completion_scheduler_of_t
Retrieve the completion scheduler for a given completion tag.
constexpr auto get_env() const noexcept -> extend_env_t< ExecEnvPolicy, stdexec::env_of_t< Rcvr > >
ScheduleFromReceiver< WithDelegatedSyncPolicy, WithoutExecEnvPolicy, Schd, Rcvr > rcvr_t
stdexec::operation_state auto connect(Rcvr rcvr) &&noexcept(std::is_nothrow_constructible_v< rcvr_t< Rcvr >, Schd &&, Rcvr && > &&stdexec::__nothrow_connectable< Sndr &&, rcvr_t< Rcvr > >)
ScheduleFromReceiver< WithoutDelegatedSyncPolicy, exec_env_policy_t< stdexec::env_of_t< Rcvr > >, Rcvr > rcvr_t
stdexec::operation_state auto connect(Rcvr rcvr) &&noexcept(std::is_nothrow_constructible_v< rcvr_t< Rcvr >, Rcvr && > &&stdexec::__nothrow_connectable< Sndr &&, rcvr_t< Rcvr > >)
Impl::completion_scheduler_of_t< stdexec::set_value_t, Sndr, Env > schd_t
auto operator()(const Env &env, stdexec::schedule_from_t, stdexec::__ignore, Sndr &&sndr) const noexcept(std::is_nothrow_constructible_v< ScheduleFromSender< WithDelegatedSyncPolicy, schd_t< Sndr, Env >, Sndr >, schd_t< Sndr, Env > &&, Sndr && >)
Kokkos::DefaultExecutionSpace execution_space