kokkos-execution
0.0.1
Toggle main menu visibility
Loading...
Searching...
No Matches
sync_wait.hpp
Go to the documentation of this file.
1
#ifndef KOKKOS_EXECUTION_IMPL_SYNC_WAIT_HPP
2
#define KOKKOS_EXECUTION_IMPL_SYNC_WAIT_HPP
3
4
#include "
kokkos-execution/stdexec.hpp
"
5
6
#include "
kokkos-execution/impl/completion_signal.hpp
"
7
#include "
kokkos-execution/impl/dispatch_label.hpp
"
8
#include "
kokkos-execution/impl/event.hpp
"
9
#include "
kokkos-execution/impl/sender_introspection.hpp
"
10
#include "
kokkos-execution/impl/state.hpp
"
11
12
namespace
Kokkos::Execution::Impl::SyncWait
{
13
15
struct
env
{
16
stdexec::run_loop::scheduler
schd
;
17
18
[[nodiscard]]
19
auto
query
(stdexec::get_scheduler_t)
const
noexcept
-> stdexec::run_loop::scheduler {
20
return
schd
;
21
}
22
23
[[nodiscard]]
24
auto
query
(stdexec::get_delegation_scheduler_t)
const
noexcept
-> stdexec::run_loop::scheduler {
25
return
schd
;
26
}
27
};
28
30
template
<
typename
HasErrorPtr>
31
struct
State
;
32
33
template
<>
34
struct
State
<std::true_type> {
35
std::exception_ptr
error
;
36
stdexec::run_loop
loop
;
37
};
38
39
template
<>
40
struct
State
<std::false_type> {
41
stdexec::run_loop
loop
;
42
};
43
45
template
<Kokkos::ExecutionSpace Exec,
typename
HasErrorPtr = std::false_type,
typename
ResultType = std::tuple<>>
46
struct
Receiver
{
47
using
receiver_concept
=
SubmittedReceiverTag
;
48
49
static
constexpr
auto
label
=
Impl::dispatch_label
<Exec,
": sync_wait"
>();
50
51
Impl::State<Exec>
const
*
state
;
52
State<HasErrorPtr>
*
runloop_state
;
53
std::optional<ResultType>*
result
;
54
55
template
<
typename
... Args>
56
void
set_value
(Args&&... args) &&
noexcept
{
57
result
->emplace(std::forward<Args>(args)...);
58
runloop_state
->loop.finish();
59
}
60
61
template
<
typename
Error>
62
void
set_error
(Error&& err) &&
noexcept
requires
HasErrorPtr::value
63
{
64
runloop_state
->error = std::forward<Error>(err);
65
state
->
exec
.fence(std::string(
label
));
66
runloop_state
->loop.finish();
67
}
68
69
void
set_stopped
() &&
noexcept
{
70
state
->
exec
.fence(std::string(
label
));
71
runloop_state
->loop.finish();
72
}
73
74
void
submitted
() &&
noexcept
{
75
state
->
exec
.fence(std::string(
label
));
76
result
->emplace();
77
runloop_state
->loop.finish();
78
}
79
80
void
submitted
(
OptionalConstEventRef<Exec>
dep) &&
noexcept
{
81
if
(dep.has_value()) {
82
Impl::wait
(dep.get());
83
}
84
result
->emplace();
85
runloop_state
->loop.finish();
86
}
87
88
[[nodiscard]]
89
constexpr
auto
get_env
() const noexcept ->
env
{
90
return
{.schd =
runloop_state
->loop.get_scheduler()};
91
}
92
};
93
94
struct
SyncWait
{
95
template
<
typename
Sndr>
96
using
sends_error
= std::bool_constant<stdexec::__sends<stdexec::set_error_t, Sndr, env>>;
97
98
template
<
typename
Sndr>
99
using
result_t
= stdexec::__sync_wait::__value_tuple_for_t<Sndr>;
100
101
template
<
typename
Sndr>
102
using
receiver_t
=
Receiver<Impl::exec_of_t<Sndr, env>
,
sends_error<Sndr>
,
result_t<Sndr>
>;
103
104
template
<
typename
Sndr>
105
static
constexpr
bool
is_nothrow_connectable
= stdexec::__nothrow_connectable<Sndr, receiver_t<Sndr>>;
106
111
template
<stdexec::sender Sndr>
112
auto
operator()
(Sndr&& sndr)
const
noexcept
(!
sends_error<Sndr&&>::value
&&
is_nothrow_connectable<Sndr&&>
)
113
-> std::optional<
result_t<Sndr&&>
> {
115
static_assert
(
noexcept
(std::declval<State<sends_error<Sndr&&>>>().loop.run()));
116
117
State<sends_error<Sndr&&>
> runloop_state;
118
119
std::optional<result_t<Sndr&&>> result{};
120
121
Receiver
rcvr{
122
.state = stdexec::get_completion_scheduler<stdexec::set_value_t>(
123
stdexec::get_env(sndr),
env
{.schd = runloop_state.loop.get_scheduler()})
124
.state,
125
.runloop_state = std::addressof(runloop_state),
126
.result = std::addressof(result)};
127
128
static_assert
(std::same_as<
decltype
(rcvr),
receiver_t<Sndr&&>
>);
129
130
auto
op_state = stdexec::connect(std::forward<Sndr>(sndr), std::move(rcvr));
131
132
stdexec::start(op_state);
133
134
runloop_state.loop.run();
135
136
if
constexpr
(
sends_error<Sndr&&>::value
)
137
if
(runloop_state.error)
138
std::rethrow_exception(std::move(runloop_state.error));
139
140
return
result;
141
}
142
};
143
152
template
<
template
<
typename
...>
typename
SndrTrait>
153
struct
ApplySenderFor
{
154
template
<
typename
Sndr>
155
requires
SndrTrait<Sndr, env>::value
156
auto
operator()
(Sndr&& sndr)
const
noexcept
(std::is_nothrow_invocable_v<SyncWait, Sndr&&>) {
157
return
SyncWait
{}(std::forward<Sndr>(sndr));
158
}
159
};
160
161
}
// namespace Kokkos::Execution::Impl::SyncWait
162
163
#endif
// KOKKOS_EXECUTION_IMPL_SYNC_WAIT_HPP
completion_signal.hpp
dispatch_label.hpp
event.hpp
stdexec.hpp
Kokkos::Execution::Impl::SyncWait
Definition
sync_wait.hpp:12
Kokkos::Execution::Impl::OptionalConstEventRef
OptionalRef< const Event< Exec > > OptionalConstEventRef
Optionally stores a reference to a const Impl::Event.
Definition
event.hpp:178
Kokkos::Execution::Impl::wait
void wait(const Event< Exec > &... events)
Wait for events to complete.
Definition
event.hpp:152
Kokkos::Execution::Impl::dispatch_label
consteval std::string_view dispatch_label() noexcept
View the dispatch label as a std::string_view.
Definition
dispatch_label.hpp:47
sender_introspection.hpp
state.hpp
Kokkos::Execution::Impl::State
Definition
state.hpp:9
Kokkos::Execution::Impl::State::exec
Exec exec
Definition
state.hpp:10
Kokkos::Execution::Impl::SubmittedReceiverTag
Definition
submitted.hpp:11
Kokkos::Execution::Impl::SyncWait::ApplySenderFor
Customize stdexec::sync_wait.
Definition
sync_wait.hpp:153
Kokkos::Execution::Impl::SyncWait::ApplySenderFor::operator()
auto operator()(Sndr &&sndr) const noexcept(std::is_nothrow_invocable_v< SyncWait, Sndr && >)
Definition
sync_wait.hpp:156
Kokkos::Execution::Impl::SyncWait::Receiver
Receiver for stdexec::sync_wait.
Definition
sync_wait.hpp:46
Kokkos::Execution::Impl::SyncWait::Receiver::submitted
void submitted() &&noexcept
Definition
sync_wait.hpp:74
Kokkos::Execution::Impl::SyncWait::Receiver< Impl::exec_of_t< Sndr, env >, sends_error< Sndr >, result_t< Sndr > >::result
std::optional< result_t< Sndr > > * result
Definition
sync_wait.hpp:53
Kokkos::Execution::Impl::SyncWait::Receiver::submitted
void submitted(OptionalConstEventRef< Exec > dep) &&noexcept
Definition
sync_wait.hpp:80
Kokkos::Execution::Impl::SyncWait::Receiver< Impl::exec_of_t< Sndr, env >, sends_error< Sndr >, result_t< Sndr > >::runloop_state
State< sends_error< Sndr > > * runloop_state
Definition
sync_wait.hpp:52
Kokkos::Execution::Impl::SyncWait::Receiver< Impl::exec_of_t< Sndr, env >, sends_error< Sndr >, result_t< Sndr > >::label
static constexpr auto label
Definition
sync_wait.hpp:49
Kokkos::Execution::Impl::SyncWait::Receiver< Impl::exec_of_t< Sndr, env >, sends_error< Sndr >, result_t< Sndr > >::state
Impl::State< Exec > const * state
Definition
sync_wait.hpp:51
Kokkos::Execution::Impl::SyncWait::Receiver::receiver_concept
SubmittedReceiverTag receiver_concept
Definition
sync_wait.hpp:47
Kokkos::Execution::Impl::SyncWait::Receiver::set_error
void set_error(Error &&err) &&noexcept
Definition
sync_wait.hpp:62
Kokkos::Execution::Impl::SyncWait::Receiver::set_stopped
void set_stopped() &&noexcept
Definition
sync_wait.hpp:69
Kokkos::Execution::Impl::SyncWait::Receiver::set_value
void set_value(Args &&... args) &&noexcept
Definition
sync_wait.hpp:56
Kokkos::Execution::Impl::SyncWait::Receiver::get_env
constexpr auto get_env() const noexcept -> env
Definition
sync_wait.hpp:89
Kokkos::Execution::Impl::SyncWait::State< std::false_type >::loop
stdexec::run_loop loop
Definition
sync_wait.hpp:41
Kokkos::Execution::Impl::SyncWait::State< std::true_type >::error
std::exception_ptr error
Definition
sync_wait.hpp:35
Kokkos::Execution::Impl::SyncWait::State< std::true_type >::loop
stdexec::run_loop loop
Definition
sync_wait.hpp:36
Kokkos::Execution::Impl::SyncWait::State
Inspired by https://github.com/NVIDIA/stdexec/blob/16076a81efa4477513e6ede9c2741fd034ecef99/include/s...
Definition
sync_wait.hpp:31
Kokkos::Execution::Impl::SyncWait::SyncWait
Definition
sync_wait.hpp:94
Kokkos::Execution::Impl::SyncWait::SyncWait::receiver_t
Receiver< Impl::exec_of_t< Sndr, env >, sends_error< Sndr >, result_t< Sndr > > receiver_t
Definition
sync_wait.hpp:102
Kokkos::Execution::Impl::SyncWait::SyncWait::is_nothrow_connectable
static constexpr bool is_nothrow_connectable
Definition
sync_wait.hpp:105
Kokkos::Execution::Impl::SyncWait::SyncWait::sends_error
std::bool_constant< stdexec::__sends< stdexec::set_error_t, Sndr, env > > sends_error
Definition
sync_wait.hpp:96
Kokkos::Execution::Impl::SyncWait::SyncWait::operator()
auto operator()(Sndr &&sndr) const noexcept(!sends_error< Sndr && >::value &&is_nothrow_connectable< Sndr && >) -> std::optional< result_t< Sndr && > >
Definition
sync_wait.hpp:112
Kokkos::Execution::Impl::SyncWait::SyncWait::result_t
stdexec::__sync_wait::__value_tuple_for_t< Sndr > result_t
Definition
sync_wait.hpp:99
Kokkos::Execution::Impl::SyncWait::env
Inspired by https://github.com/NVIDIA/stdexec/blob/16076a81efa4477513e6ede9c2741fd034ecef99/include/s...
Definition
sync_wait.hpp:15
Kokkos::Execution::Impl::SyncWait::env::query
auto query(stdexec::get_delegation_scheduler_t) const noexcept -> stdexec::run_loop::scheduler
Definition
sync_wait.hpp:24
Kokkos::Execution::Impl::SyncWait::env::schd
stdexec::run_loop::scheduler schd
Definition
sync_wait.hpp:16
Kokkos::Execution::Impl::SyncWait::env::query
auto query(stdexec::get_scheduler_t) const noexcept -> stdexec::run_loop::scheduler
Definition
sync_wait.hpp:19
kokkos-execution
impl
sync_wait.hpp
Generated on
for kokkos-execution by
1.18.0