1#ifndef KOKKOS_EXECUTION_IMPL_COMPLETION_SIGNAL_HPP
2#define KOKKOS_EXECUTION_IMPL_COMPLETION_SIGNAL_HPP
6#if defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
28template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
31 bool operator()(
const Exec& exec,
const Rcvr& rcvr)
const noexcept
32 requires(stdexec::__queryable_with<stdexec::env_of_t<Rcvr>,
get_exec_t>)
36 std::remove_cvref_t<stdexec::__query_result_t<stdexec::env_of_t<Rcvr>,
get_exec_t>>,
39 const auto& src = exec;
40 const auto& dst =
get_exec(stdexec::get_env(rcvr)).get();
41#if defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
42 PLOG_DEBUG <<
"The synchronization happens if " << Kokkos::Tools::Experimental::device_id(src)
43 <<
" is not equal to " << Kokkos::Tools::Experimental::device_id(dst) <<
'.';
51 constexpr bool operator()(
const Exec&,
const Rcvr&)
const noexcept
52 requires(!stdexec::__queryable_with<stdexec::env_of_t<Rcvr>,
get_exec_t>)
54#if defined(KOKKOS_EXECUTION_ENABLE_DEBUG_LOGGING)
55 PLOG_DEBUG <<
"Synchronization always required.";
63template <
typename Rcvr,
typename Exec>
65 stdexec::receiver<Rcvr>
68 std::move(rcvr).continues_after();
69 std::move(rcvr).continues_after(
event);
79template <
typename Policy, Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
87template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
93 void propagate(stdexec::set_value_t,
const Exec& exec) &
noexcept {
95 stdexec::set_value(std::move(
rcvr));
98 exec.fence(std::string(
label));
99 stdexec::set_value(std::move(
rcvr));
101 stdexec::set_error(std::move(
rcvr), std::current_exception());
106 template <
typename Error>
107 void propagate(stdexec::set_error_t, Error&& err) &
noexcept {
108 stdexec::set_error(std::move(
rcvr), std::forward<Error>(err));
112 stdexec::set_stopped(std::move(
rcvr));
116template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
127 stdexec::set_error(std::move(
completion_signal->rcvr), std::current_exception());
138template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
143 stdexec::schedule_result_t<delegation_scheduler_t>,
151 constexpr explicit CompletionSignal(Rcvr rcvr_)
noexcept(std::is_nothrow_move_constructible_v<Rcvr>)
152 :
rcvr(std::move(rcvr_)) {
155 void propagate(stdexec::set_value_t,
const Exec& exec) &
noexcept {
157 stdexec::set_value(std::move(
rcvr));
164 stdexec::schedule(stdexec::get_delegation_scheduler(stdexec::get_env(
rcvr))),
168 stdexec::set_error(std::move(
rcvr), std::current_exception());
173 template <
typename Error>
174 void propagate(stdexec::set_error_t, Error&& err) &
noexcept {
175 stdexec::set_error(std::move(
rcvr), std::forward<Error>(err));
179 stdexec::set_stopped(std::move(
rcvr));
183template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
189 stdexec::set_value(std::move(
rcvr));
192 void propagate(stdexec::set_value_t,
const Exec&) &
noexcept {
193 std::move(
rcvr).continues_after();
196 template <
typename Error>
197 void propagate(stdexec::set_error_t, Error&& err) &
noexcept {
198 stdexec::set_error(std::move(
rcvr), std::forward<Error>(err));
202 stdexec::set_stopped(std::move(
rcvr));
212template <Kokkos::ExecutionSpace Exec, stdexec::receiver Rcvr>
219 constexpr explicit CompletionSignal(Rcvr rcvr_)
noexcept(std::is_nothrow_move_constructible_v<Rcvr>)
220 :
rcvr(std::move(rcvr_)) {
223 void propagate(stdexec::set_value_t,
const Exec& exec) &
noexcept {
225 std::move(
rcvr).continues_after();
233 template <
typename Error>
234 void propagate(stdexec::set_error_t, Error&& err) &
noexcept {
235 stdexec::set_error(std::move(
rcvr), std::forward<Error>(err));
239 stdexec::set_stopped(std::move(
rcvr));
Data structure that has an interface similar to std::optional but stores the value with stdexec::__ma...
Constrain an EventType type to be a valid event type for Exec execution space type.
std::optional< Event< Exec > > event_storage_t
stdexec::__query_result_t< const Env &, stdexec::get_delegation_scheduler_t > delegation_scheduler_of_t
void record(Event< Exec > &event, const Exec &exec)
Record event on exec.
constexpr get_exec_t get_exec
void wait(const Event< Exec > &event)
Wait for event to complete.
consteval std::string_view dispatch_label() noexcept
View the dispatch label as a std::string_view.
void propagate(stdexec::set_error_t, Error &&err) &noexcept
void propagate(stdexec::set_value_t, const Exec &exec) &noexcept
void propagate(stdexec::set_stopped_t) &noexcept
Impl::event_storage_t< Exec > event_storage_t
constexpr CompletionSignal(Rcvr rcvr_) noexcept(std::is_nothrow_move_constructible_v< Rcvr >)
void propagate(stdexec::set_value_t, const Exec &exec) &noexcept
static constexpr auto label
void propagate(stdexec::set_stopped_t) &noexcept
void propagate(stdexec::set_error_t, Error &&err) &noexcept
void propagate(stdexec::set_stopped_t) &noexcept
void propagate(stdexec::set_value_t) &noexcept
void propagate(stdexec::set_error_t, Error &&err) &noexcept
void propagate(stdexec::set_value_t, const Exec &) &noexcept
stdexec::connect_result_t< stdexec::schedule_result_t< delegation_scheduler_t >, ScheduleWaitEventReceiver< Exec, Rcvr > > inner_opstate_t
void propagate(stdexec::set_error_t, Error &&err) &noexcept
OptionalStorage< inner_opstate_t > inner_opstate
constexpr CompletionSignal(Rcvr rcvr_) noexcept(std::is_nothrow_move_constructible_v< Rcvr >)
void propagate(stdexec::set_stopped_t) &noexcept
Impl::event_storage_t< Exec > event_storage_t
Impl::delegation_scheduler_of_t< stdexec::env_of_t< Rcvr > > delegation_scheduler_t
void propagate(stdexec::set_value_t, const Exec &exec) &noexcept
An event that can be recorded on an execution space instance.
Wrap a Kokkos execution space to make it cheap to copy/move in new environments.
constexpr bool operator()(const Exec &, const Rcvr &) const noexcept
bool operator()(const Exec &exec, const Rcvr &rcvr) const noexcept
stdexec::receiver_tag receiver_concept
void set_value() &&noexcept
CompletionSignal< SyncPolicy::ScheduleWaitEvent, Exec, Rcvr > * completion_signal