Skip to content

Commit 79f13f3

Browse files
authored
give stdexec::on the standard-conforming there-and-back-again behavior (#1576)
1 parent 9154664 commit 79f13f3

26 files changed

Lines changed: 325 additions & 328 deletions

.clangd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ CompileFlags:
7777
- -Xtemplight
7878
- -profiler
7979
- -ignore-system
80+
- "-fconcepts-diagnostics-depth=*"
8081
Diagnostics:
8182
Suppress:
8283
- "variadic_device_fn"

examples/nvexec/maxwell/snr.cuh

Lines changed: 78 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020

2121
#include "common.cuh"
2222
#include "stdexec/execution.hpp"
23-
#include "exec/on.hpp"
2423

24+
namespace ex = stdexec;
2525

2626
#if defined(_NVHPC_CUDA) || defined(__CUDACC__)
2727
# include "nvexec/detail/throw_on_cuda_error.cuh"
@@ -30,18 +30,18 @@
3030
#else
3131
namespace nvexec {
3232
struct stream_receiver_base {
33-
using receiver_concept = stdexec::receiver_t;
33+
using receiver_concept = ex::receiver_t;
3434
};
3535

3636
struct stream_sender_base {
37-
using sender_concept = stdexec::sender_t;
37+
using sender_concept = ex::sender_t;
3838
};
3939

4040
namespace detail {
4141
struct stream_op_state_base { };
4242
} // namespace detail
4343

44-
inline bool is_on_gpu() {
44+
inline auto is_on_gpu() -> bool {
4545
return false;
4646
}
4747
} // namespace nvexec
@@ -73,13 +73,13 @@ namespace nvexec::_strm::repeat_n {
7373
op_state_.i_++;
7474

7575
if (op_state_.i_ == op_state_.n_) {
76-
op_state_.propagate_completion_signal(stdexec::set_value);
76+
op_state_.propagate_completion_signal(ex::set_value);
7777
return;
7878
}
7979

80-
auto sch = stdexec::get_scheduler(stdexec::get_env(op_state_.rcvr_));
80+
auto sch = ex::get_scheduler(ex::get_env(op_state_.rcvr_));
8181
inner_op_state_t& inner_op_state = op_state_.inner_op_state_.emplace(
82-
stdexec::__emplace_from{[&]() noexcept {
82+
ex::__emplace_from{[&]() noexcept {
8383
return ex::connect(ex::schedule(sch) | op_state_.closure_, receiver_2_t<OpT>{op_state_});
8484
}});
8585

@@ -115,9 +115,9 @@ namespace nvexec::_strm::repeat_n {
115115
using inner_op_state_t = typename OpT::inner_op_state_t;
116116

117117
if (op_state_.n_) {
118-
auto sch = stdexec::get_scheduler(stdexec::get_env(op_state_.rcvr_));
118+
auto sch = ex::get_scheduler(ex::get_env(op_state_.rcvr_));
119119
inner_op_state_t& inner_op_state = op_state_.inner_op_state_.emplace(
120-
stdexec::__emplace_from{[&]() noexcept {
120+
ex::__emplace_from{[&]() noexcept {
121121
return ex::connect(
122122
ex::schedule(sch) | op_state_.closure_, receiver_2_t<OpT>{op_state_});
123123
}});
@@ -148,10 +148,10 @@ namespace nvexec::_strm::repeat_n {
148148

149149
template <class PredecessorSenderId, class Closure, class ReceiverId>
150150
struct operation_state_t : operation_state_base_t<ReceiverId> {
151-
using PredSender = stdexec::__t<PredecessorSenderId>;
152-
using Receiver = stdexec::__t<ReceiverId>;
153-
using Scheduler = std::invoke_result_t<stdexec::get_scheduler_t, stdexec::env_of_t<Receiver>>;
154-
using InnerSender = std::invoke_result_t<Closure, stdexec::schedule_result_t<Scheduler>>;
151+
using PredSender = ex::__t<PredecessorSenderId>;
152+
using Receiver = ex::__t<ReceiverId>;
153+
using Scheduler = std::invoke_result_t<ex::get_scheduler_t, ex::env_of_t<Receiver>>;
154+
using InnerSender = std::invoke_result_t<Closure, ex::schedule_result_t<Scheduler>>;
155155

156156
using predecessor_op_state_t =
157157
ex::connect_result_t<PredSender, receiver_1_t<operation_state_t>>;
@@ -168,25 +168,25 @@ namespace nvexec::_strm::repeat_n {
168168
if (this->stream_provider_.status_ != cudaSuccess) {
169169
// Couldn't allocate memory for operation state, complete with error
170170
this->propagate_completion_signal(
171-
stdexec::set_error, std::move(this->stream_provider_.status_));
171+
ex::set_error, std::move(this->stream_provider_.status_));
172172
} else {
173173
if (n_) {
174-
stdexec::start(*pred_op_state_);
174+
ex::start(*pred_op_state_);
175175
} else {
176-
this->propagate_completion_signal(stdexec::set_value);
176+
this->propagate_completion_signal(ex::set_value);
177177
}
178178
}
179179
}
180180

181181
operation_state_t(PredSender&& pred_sender, Closure closure, Receiver&& rcvr, std::size_t n)
182182
: operation_state_base_t<ReceiverId>(
183183
static_cast<Receiver&&>(rcvr),
184-
stdexec::get_completion_scheduler<stdexec::set_value_t>(stdexec::get_env(pred_sender))
184+
ex::get_completion_scheduler<ex::set_value_t>(ex::get_env(pred_sender))
185185
.context_state_)
186186
, pred_sender_{static_cast<PredSender&&>(pred_sender)}
187187
, closure_(closure)
188188
, n_(n) {
189-
pred_op_state_.emplace(stdexec::__emplace_from{[&]() noexcept {
189+
pred_op_state_.emplace(ex::__emplace_from{[&]() noexcept {
190190
return ex::connect(static_cast<PredSender&&>(pred_sender_), receiver_1_t{*this});
191191
}});
192192
}
@@ -204,21 +204,21 @@ namespace repeat_n_detail {
204204
OpT& op_state_;
205205

206206
public:
207-
using receiver_concept = stdexec::receiver_t;
207+
using receiver_concept = ex::receiver_t;
208208

209209
void set_value() noexcept {
210210
using inner_op_state_t = typename OpT::inner_op_state_t;
211211

212212
op_state_.i_++;
213213

214214
if (op_state_.i_ == op_state_.n_) {
215-
stdexec::set_value(std::move(op_state_.rcvr_));
215+
ex::set_value(std::move(op_state_.rcvr_));
216216
return;
217217
}
218218

219-
auto sch = stdexec::get_scheduler(stdexec::get_env(op_state_.rcvr_));
219+
auto sch = ex::get_scheduler(ex::get_env(op_state_.rcvr_));
220220
inner_op_state_t& inner_op_state = op_state_.inner_op_state_.emplace(
221-
stdexec::__emplace_from{[&]() noexcept {
221+
ex::__emplace_from{[&]() noexcept {
222222
return ex::connect(ex::schedule(sch) | op_state_.closure_, receiver_2_t<OpT>{op_state_});
223223
}});
224224

@@ -227,16 +227,16 @@ namespace repeat_n_detail {
227227

228228
template <class Error>
229229
void set_error(Error&& err) noexcept {
230-
stdexec::set_error(std::move(op_state_.rcvr_), static_cast<Error&&>(err));
230+
ex::set_error(std::move(op_state_.rcvr_), static_cast<Error&&>(err));
231231
}
232232

233233
void set_stopped() noexcept {
234-
stdexec::set_stopped(std::move(op_state_.rcvr_));
234+
ex::set_stopped(std::move(op_state_.rcvr_));
235235
}
236236

237237
[[nodiscard]]
238-
auto get_env() const noexcept -> stdexec::env_of_t<Receiver> {
239-
return stdexec::get_env(op_state_.rcvr_);
238+
auto get_env() const noexcept -> ex::env_of_t<Receiver> {
239+
return ex::get_env(op_state_.rcvr_);
240240
}
241241

242242
explicit receiver_2_t(OpT& op_state)
@@ -251,37 +251,37 @@ namespace repeat_n_detail {
251251
OpT& op_state_;
252252

253253
public:
254-
using receiver_concept = stdexec::receiver_t;
254+
using receiver_concept = ex::receiver_t;
255255

256256
void set_value() noexcept {
257257
using inner_op_state_t = typename OpT::inner_op_state_t;
258258

259259
if (op_state_.n_) {
260-
auto sch = stdexec::get_scheduler(stdexec::get_env(op_state_.rcvr_));
260+
auto sch = ex::get_scheduler(ex::get_env(op_state_.rcvr_));
261261
inner_op_state_t& inner_op_state = op_state_.inner_op_state_.emplace(
262-
stdexec::__emplace_from{[&]() noexcept {
262+
ex::__emplace_from{[&]() noexcept {
263263
return ex::connect(
264264
ex::schedule(sch) | op_state_.closure_, receiver_2_t<OpT>{op_state_});
265265
}});
266266

267267
ex::start(inner_op_state);
268268
} else {
269-
stdexec::set_value(std::move(op_state_.rcvr_));
269+
ex::set_value(std::move(op_state_.rcvr_));
270270
}
271271
}
272272

273273
template <class Error>
274274
void set_error(Error&& err) noexcept {
275-
stdexec::set_error(std::move(op_state_.rcvr_), static_cast<Error&&>(err));
275+
ex::set_error(std::move(op_state_.rcvr_), static_cast<Error&&>(err));
276276
}
277277

278278
void set_stopped() noexcept {
279-
stdexec::set_stopped(std::move(op_state_.rcvr_));
279+
ex::set_stopped(std::move(op_state_.rcvr_));
280280
}
281281

282282
[[nodiscard]]
283-
auto get_env() const noexcept -> stdexec::env_of_t<Receiver> {
284-
return stdexec::get_env(op_state_.rcvr_);
283+
auto get_env() const noexcept -> ex::env_of_t<Receiver> {
284+
return ex::get_env(op_state_.rcvr_);
285285
}
286286

287287
explicit receiver_1_t(OpT& op_state)
@@ -291,10 +291,10 @@ namespace repeat_n_detail {
291291

292292
template <class PredecessorSenderId, class Closure, class ReceiverId>
293293
struct operation_state_t {
294-
using PredSender = stdexec::__t<PredecessorSenderId>;
295-
using Receiver = stdexec::__t<ReceiverId>;
296-
using Scheduler = std::invoke_result_t<stdexec::get_scheduler_t, stdexec::env_of_t<Receiver>>;
297-
using InnerSender = std::invoke_result_t<Closure, stdexec::schedule_result_t<Scheduler>>;
294+
using PredSender = ex::__t<PredecessorSenderId>;
295+
using Receiver = ex::__t<ReceiverId>;
296+
using Scheduler = std::invoke_result_t<ex::get_scheduler_t, ex::env_of_t<Receiver>>;
297+
using InnerSender = std::invoke_result_t<Closure, ex::schedule_result_t<Scheduler>>;
298298

299299
using predecessor_op_state_t =
300300
ex::connect_result_t<PredSender, receiver_1_t<operation_state_t>>;
@@ -310,9 +310,9 @@ namespace repeat_n_detail {
310310

311311
void start() & noexcept {
312312
if (n_) {
313-
stdexec::start(*pred_op_state_);
313+
ex::start(*pred_op_state_);
314314
} else {
315-
stdexec::set_value(std::move(rcvr_));
315+
ex::set_value(std::move(rcvr_));
316316
}
317317
}
318318

@@ -321,7 +321,7 @@ namespace repeat_n_detail {
321321
, closure_(closure)
322322
, rcvr_(rcvr)
323323
, n_(n) {
324-
pred_op_state_.emplace(stdexec::__emplace_from{[&]() noexcept {
324+
pred_op_state_.emplace(ex::__emplace_from{[&]() noexcept {
325325
return ex::connect(static_cast<PredSender&&>(pred_sender_), receiver_1_t{*this});
326326
}});
327327
}
@@ -331,16 +331,16 @@ namespace repeat_n_detail {
331331
struct repeat_n_sender_t {
332332
using __t = repeat_n_sender_t;
333333
using __id = repeat_n_sender_t;
334-
using Sender = stdexec::__t<SenderId>;
335-
using sender_concept = stdexec::sender_t;
334+
using Sender = ex::__t<SenderId>;
335+
using sender_concept = ex::sender_t;
336336

337-
using completion_signatures = stdexec::completion_signatures<
338-
stdexec::set_value_t(),
339-
stdexec::set_stopped_t(),
340-
stdexec::set_error_t(std::exception_ptr)
337+
using completion_signatures = ex::completion_signatures<
338+
ex::set_value_t(),
339+
ex::set_stopped_t(),
340+
ex::set_error_t(std::exception_ptr)
341341
#if defined(_NVHPC_CUDA) || defined(__CUDACC__)
342342
,
343-
stdexec::set_error_t(cudaError_t)
343+
ex::set_error_t(cudaError_t)
344344
#endif
345345
>;
346346

@@ -349,50 +349,50 @@ namespace repeat_n_detail {
349349
std::size_t n_{};
350350

351351
#if defined(_NVHPC_CUDA) || defined(__CUDACC__)
352-
template <stdexec::__decays_to<repeat_n_sender_t> Self, stdexec::receiver Receiver>
353-
requires(stdexec::sender_to<Sender, Receiver>)
352+
template <ex::__decays_to<repeat_n_sender_t> Self, ex::receiver Receiver>
353+
requires(ex::sender_to<Sender, Receiver>)
354354
&& (!nvexec::_strm::receiver_with_stream_env<Receiver>)
355-
friend auto tag_invoke(stdexec::connect_t, Self&& self, Receiver r)
356-
-> repeat_n_detail::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>> {
357-
return repeat_n_detail::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>>(
355+
friend auto tag_invoke(ex::connect_t, Self&& self, Receiver r)
356+
-> repeat_n_detail::operation_state_t<SenderId, Closure, ex::__id<Receiver>> {
357+
return repeat_n_detail::operation_state_t<SenderId, Closure, ex::__id<Receiver>>(
358358
static_cast<Sender&&>(self.sender_), self.closure_, static_cast<Receiver&&>(r), self.n_);
359359
}
360360

361-
template <stdexec::__decays_to<repeat_n_sender_t> Self, stdexec::receiver Receiver>
362-
requires(stdexec::sender_to<Sender, Receiver>)
361+
template <ex::__decays_to<repeat_n_sender_t> Self, ex::receiver Receiver>
362+
requires(ex::sender_to<Sender, Receiver>)
363363
&& (nvexec::_strm::receiver_with_stream_env<Receiver>)
364-
friend auto tag_invoke(stdexec::connect_t, Self&& self, Receiver r)
365-
-> nvexec::_strm::repeat_n::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>> {
366-
return nvexec::_strm::repeat_n::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>>(
364+
friend auto tag_invoke(ex::connect_t, Self&& self, Receiver r)
365+
-> nvexec::_strm::repeat_n::operation_state_t<SenderId, Closure, ex::__id<Receiver>> {
366+
return nvexec::_strm::repeat_n::operation_state_t<SenderId, Closure, ex::__id<Receiver>>(
367367
static_cast<Sender&&>(self.sender_), self.closure_, static_cast<Receiver&&>(r), self.n_);
368368
}
369369
#else
370-
template <stdexec::__decays_to<repeat_n_sender_t> Self, stdexec::receiver Receiver>
371-
requires stdexec::sender_to<Sender, Receiver>
372-
friend auto tag_invoke(stdexec::connect_t, Self&& self, Receiver r)
373-
-> repeat_n_detail::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>> {
374-
return repeat_n_detail::operation_state_t<SenderId, Closure, stdexec::__id<Receiver>>(
370+
template <ex::__decays_to<repeat_n_sender_t> Self, ex::receiver Receiver>
371+
requires ex::sender_to<Sender, Receiver>
372+
friend auto tag_invoke(ex::connect_t, Self&& self, Receiver r)
373+
-> repeat_n_detail::operation_state_t<SenderId, Closure, ex::__id<Receiver>> {
374+
return repeat_n_detail::operation_state_t<SenderId, Closure, ex::__id<Receiver>>(
375375
static_cast<Sender&&>(self.sender_), self.closure_, static_cast<Receiver&&>(r), self.n_);
376376
}
377377
#endif
378378

379-
auto get_env() const noexcept -> stdexec::env_of_t<const Sender&> {
380-
return stdexec::get_env(sender_);
379+
auto get_env() const noexcept -> ex::env_of_t<const Sender&> {
380+
return ex::get_env(sender_);
381381
}
382382
};
383383
} // namespace repeat_n_detail
384384

385385
struct repeat_n_t {
386-
template <stdexec::sender Sender, stdexec::__sender_adaptor_closure Closure>
386+
template <ex::sender Sender, ex::__sender_adaptor_closure Closure>
387387
auto operator()(Sender&& __sndr, std::size_t n, Closure closure) const noexcept
388-
-> repeat_n_detail::repeat_n_sender_t<stdexec::__id<Sender>, Closure> {
389-
return repeat_n_detail::repeat_n_sender_t<stdexec::__id<Sender>, Closure>{
388+
-> repeat_n_detail::repeat_n_sender_t<ex::__id<Sender>, Closure> {
389+
return repeat_n_detail::repeat_n_sender_t<ex::__id<Sender>, Closure>{
390390
std::forward<Sender>(__sndr), closure, n};
391391
}
392392

393-
template <stdexec::__sender_adaptor_closure Closure>
393+
template <ex::__sender_adaptor_closure Closure>
394394
auto operator()(std::size_t n, Closure closure) const
395-
-> stdexec::__binder_back<repeat_n_t, std::size_t, Closure> {
395+
-> ex::__binder_back<repeat_n_t, std::size_t, Closure> {
396396
return {
397397
{n, static_cast<Closure&&>(closure)},
398398
{},
@@ -406,8 +406,8 @@ inline constexpr repeat_n_t repeat_n{};
406406
template <class SchedulerT>
407407
[[nodiscard]]
408408
auto is_gpu_scheduler(SchedulerT&& scheduler) -> bool {
409-
auto snd = ex::just() | exec::on(scheduler, ex::then([] { return nvexec::is_on_gpu(); }));
410-
auto [on_gpu] = stdexec::sync_wait(std::move(snd)).value();
409+
auto snd = ex::just() | ex::on(scheduler, ex::then([] { return nvexec::is_on_gpu(); }));
410+
auto [on_gpu] = ex::sync_wait(std::move(snd)).value();
411411
return on_gpu;
412412
}
413413

@@ -417,9 +417,9 @@ auto maxwell_eqs_snr(
417417
bool write_results,
418418
std::size_t n_iterations,
419419
fields_accessor accessor,
420-
stdexec::scheduler auto&& computer) {
420+
ex::scheduler auto&& computer) {
421421
return ex::just()
422-
| exec::on(
422+
| ex::on(
423423
computer,
424424
repeat_n(
425425
n_iterations,
@@ -434,18 +434,18 @@ void run_snr(
434434
std::size_t n_iterations,
435435
grid_t& grid,
436436
std::string_view scheduler_name,
437-
stdexec::scheduler auto&& computer) {
437+
ex::scheduler auto&& computer) {
438438
time_storage_t time{is_gpu_scheduler(computer)};
439439
fields_accessor accessor = grid.accessor();
440440

441441
auto init = ex::just()
442-
| exec::on(computer, ex::bulk(ex::par, grid.cells, grid_initializer(dt, accessor)));
443-
stdexec::sync_wait(init);
442+
| ex::on(computer, ex::bulk(ex::par, grid.cells, grid_initializer(dt, accessor)));
443+
ex::sync_wait(init);
444444

445445
auto snd = maxwell_eqs_snr(dt, time.get(), write_vtk, n_iterations, accessor, computer);
446446

447447
report_performance(grid.cells, n_iterations, scheduler_name, [&snd] {
448-
stdexec::sync_wait(std::move(snd));
448+
ex::sync_wait(std::move(snd));
449449
});
450450
}
451451

0 commit comments

Comments
 (0)