Skip to content

Commit 8752c0d

Browse files
committed
use new-style sender algo customization in stream_scheduler
1 parent 203a6bd commit 8752c0d

68 files changed

Lines changed: 1157 additions & 955 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.clang-format

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,14 +83,13 @@ KeepEmptyLinesAtTheStartOfBlocks: true
8383
LambdaBodyIndentation: Signature
8484
LineEnding: LF
8585
Macros: [
86-
'STDEXEC_MEMFN_DECL(X)=X',
87-
'STDEXEC_MEMFN_DECL(X,Y)=X,Y',
88-
'STDEXEC_MEMFN_DECL(X,Y,Z)=X,Y,Z',
89-
'STDEXEC_ATTRIBUTE(X)=[[]]',
86+
'STDEXEC_MEMFN_DECL(...)=__VA_ARGS__',
87+
'STDEXEC_ATTRIBUTE(X)=//',
9088
'STDEXEC_NO_UNIQUE_ADDRESS=[[no_unique_address]]',
9189
'STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS=[[no_unique_address]]',
9290
'STDEXEC_MISSING_MEMBER(X,Y)=true',
93-
'STDEXEC_DEFINE_MEMBER(X)=void foo() {}'
91+
'STDEXEC_DEFINE_MEMBER(X)=void foo() {}',
92+
'STDEXEC_AUTO_RETURN(...)=->decltype(auto){ return __VA_ARGS__; }',
9493
]
9594
MaxEmptyLinesToKeep: 2
9695
NamespaceIndentation: All

.clangd

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ CompileFlags:
3535

3636
# Use clang++ in CUDA mode to provide intellisense for files with `nvexec` in their path
3737
If:
38-
PathMatch: (include|examples|test)/nvexec.*
38+
PathMatch: .*\b(include|examples|test)/nvexec.*
3939
CompileFlags:
4040
Compiler: clang++
4141
Add:
@@ -54,6 +54,7 @@ CompileFlags:
5454
- "-ferror-limit=0"
5555
- "-fmacro-backtrace-limit=0"
5656
- "-ftemplate-backtrace-limit=0"
57+
- "-std=gnu++20"
5758
Remove:
5859
- "-stdpar*"
5960
# strip CUDA fatbin args

examples/benchmark/static_thread_pool_bulk_enqueue.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct RunThread {
4545
auto env = exec::make_env(stdexec::prop{stdexec::get_allocator, alloc});
4646
auto [start, end] = exec::_pool_::even_share(total_scheds, tid, pool.available_parallelism());
4747
auto iterate = exec::schedule_all(pool, std::views::iota(start, end))
48-
| exec::ignore_all_values() | exec::write(env);
48+
| exec::ignore_all_values() | exec::write_env(env);
4949
# else
5050
auto [start, end] = exec::_pool_::even_share(total_scheds, tid, pool.available_parallelism());
5151
auto iterate = exec::schedule_all(pool, std::views::iota(start, end))

examples/benchmark/static_thread_pool_bulk_enqueue_nested.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ struct RunThread {
4646
auto env = exec::make_env(stdexec::prop{stdexec::get_allocator, alloc});
4747
auto [start, end] = exec::_pool_::even_share(total_scheds, tid, pool.available_parallelism());
4848
auto iterate = exec::iterate(std::views::iota(start, end)) | exec::ignore_all_values()
49-
| exec::write(env);
49+
| exec::write_env(env);
5050
# else
5151
auto [start, end] = exec::_pool_::even_share(total_scheds, tid, pool.available_parallelism());
5252
auto iterate = exec::iterate(std::views::iota(start, end)) | exec::ignore_all_values();

examples/nvexec/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ function(def_cpu_example example)
9292
stdexec_executable_flags
9393
)
9494
set_source_files_properties(${source} PROPERTIES LANGUAGE ${_lang_cxx})
95+
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
96+
target_link_options(${target} PRIVATE -lc++abi -ltbb)
97+
endif()
9598
endfunction()
9699

97100
foreach(example ${nvexec_cpu_examples})

examples/nvexec/maxwell_cpu_mt.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
* limitations under the License.
1515
*/
1616

17+
#include <iostream>
18+
1719
#include "maxwell/snr.cuh"
1820
#include "maxwell/std.cuh"
1921
#include "maxwell/stdpar.cuh"

include/exec/any_sender_of.hpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,8 @@ namespace exec {
624624
template <class _Rcvr>
625625
requires receiver_of<_Rcvr, completion_signatures<_Sigs...>>
626626
&& (__callable<__query_vfun_fn<_Rcvr>, _Queries> && ...)
627-
STDEXEC_MEMFN_DECL(
628-
auto __create_vtable)(this __mtype<__t>, __mtype<_Rcvr>) noexcept -> const __t* {
627+
STDEXEC_MEMFN_DECL(auto __create_vtable)(this __mtype<__t>, __mtype<_Rcvr>) noexcept
628+
-> const __t* {
629629
static const __t __vtable_{
630630
{__any_::__rcvr_vfun_fn(
631631
static_cast<_Rcvr*>(nullptr), static_cast<_Sigs*>(nullptr))}...,
@@ -960,9 +960,8 @@ namespace exec {
960960
__immovable_operation_storage (*__connect_)(void*, __receiver_ref_t);
961961
private:
962962
template <sender_to<__receiver_ref_t> _Sender>
963-
STDEXEC_MEMFN_DECL(
964-
auto
965-
__create_vtable)(this __mtype<__vtable>, __mtype<_Sender>) noexcept -> const __vtable* {
963+
STDEXEC_MEMFN_DECL(auto __create_vtable)(this __mtype<__vtable>, __mtype<_Sender>) noexcept
964+
-> const __vtable* {
966965
static const __vtable __vtable_{
967966
{*__create_vtable(__mtype<__query_vtable<_SenderQueries>>{}, __mtype<_Sender>{})},
968967
[](void* __object_pointer, __receiver_ref_t __receiver)
@@ -1085,8 +1084,8 @@ namespace exec {
10851084
private:
10861085
template <scheduler _Scheduler>
10871086
STDEXEC_MEMFN_DECL(
1088-
auto
1089-
__create_vtable)(this __mtype<__vtable>, __mtype<_Scheduler>) noexcept -> const __vtable* {
1087+
auto __create_vtable)(this __mtype<__vtable>, __mtype<_Scheduler>) noexcept
1088+
-> const __vtable* {
10901089
static const __vtable __vtable_{
10911090
{*__create_vtable(
10921091
__mtype<__query_vtable<_SchedulerQueries, false>>{}, __mtype<_Scheduler>{})},

include/exec/env.hpp

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,10 @@ namespace exec {
118118

119119
template <__decays_to<__sender> _Self, class _Receiver>
120120
requires receiver_of<_Receiver, __completions_t<env_of_t<_Receiver>>>
121-
static auto connect(_Self&& __self, _Receiver __rcvr) //
121+
static auto connect(_Self&& __Self, _Receiver __rcvr) //
122122
noexcept(std::is_nothrow_move_constructible_v<_Receiver>)
123123
-> __operation_t<_Tag, __default_t<env_of_t<_Receiver>>, _Receiver> {
124-
return {{}, static_cast<_Self&&>(__self).__default_, static_cast<_Receiver&&>(__rcvr)};
124+
return {{}, static_cast<_Self&&>(__Self).__default_, static_cast<_Receiver&&>(__rcvr)};
125125
}
126126

127127
template <class _Env>
@@ -141,8 +141,73 @@ namespace exec {
141141

142142
inline constexpr __read_with_default::__read_with_default_t read_with_default{};
143143

144+
[[deprecated("exec::write_env has been renamed to exec::write_env")]]
144145
inline constexpr stdexec::__write_::__write_env_t write{};
145146
inline constexpr stdexec::__write_::__write_env_t write_env{};
147+
148+
namespace __write_attrs {
149+
using namespace stdexec;
150+
151+
template <class _SenderId, class _Attrs>
152+
struct __sender {
153+
using _Sender = stdexec::__t<_SenderId>;
154+
155+
struct __t {
156+
using sender_concept = sender_t;
157+
using __id = __sender;
158+
_Sender __sndr_;
159+
_Attrs __attrs_;
160+
161+
auto get_env() const noexcept -> __env::__join_t<const _Attrs&, env_of_t<_Sender>> {
162+
return stdexec::__env::__join(__attrs_, stdexec::get_env(__sndr_));
163+
}
164+
165+
template <__decays_to<__t> _Self, class... _Env>
166+
static auto get_completion_signatures(_Self&&, _Env&&...)
167+
-> completion_signatures_of_t<__copy_cvref_t<_Self, _Sender>, _Env...> {
168+
return {};
169+
}
170+
171+
template <__decays_to<__t> _Self, class _Receiver>
172+
requires sender_in<__copy_cvref_t<_Self, _Sender>, env_of_t<_Receiver>>
173+
static auto connect(_Self&& __self, _Receiver __rcvr)
174+
-> connect_result_t<__copy_cvref_t<_Self, _Sender>, _Receiver> {
175+
return stdexec::connect(std::forward<_Self>(__self).__sndr_, std::move(__rcvr));
176+
}
177+
};
178+
};
179+
180+
struct __write_attrs_t {
181+
template <class _Sender, class _Attrs>
182+
STDEXEC_ATTRIBUTE((host, device))
183+
auto operator()(_Sender snd, _Attrs __attrs_) const //
184+
-> __write_attrs::__sender<_Sender, _Attrs> {
185+
return __t<__write_attrs::__sender<__id<_Sender>, _Attrs>>{
186+
static_cast<_Sender&&>(snd), static_cast<_Attrs&&>(__attrs_)};
187+
}
188+
189+
template <class _Attrs>
190+
struct __closure {
191+
_Attrs __attrs_;
192+
193+
template <class _Sender>
194+
STDEXEC_ATTRIBUTE((host, device))
195+
friend auto operator|(_Sender __sndr_, __closure _clsr) {
196+
return __t<__write_attrs::__sender<__id<_Sender>, _Attrs>>{
197+
static_cast<_Sender&&>(__sndr_), static_cast<_Attrs&&>(_clsr.__attrs_)};
198+
}
199+
};
200+
201+
template <class _Attrs>
202+
STDEXEC_ATTRIBUTE((host, device))
203+
auto operator()(_Attrs __attrs_) const {
204+
return __closure<_Attrs>{static_cast<_Attrs&&>(__attrs_)};
205+
}
206+
};
207+
} // namespace __write_attrs
208+
209+
inline constexpr __write_attrs::__write_attrs_t write_attrs{};
210+
146211
} // namespace exec
147212

148213
STDEXEC_PRAGMA_POP()

include/exec/sequence.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
#include <stdexec/__detail/__tuple.hpp>
2020
#include <stdexec/__detail/__variant.hpp>
2121

22+
STDEXEC_PRAGMA_PUSH()
23+
STDEXEC_PRAGMA_IGNORE_GNU("-Wmissing-braces")
24+
2225
namespace exec {
2326
namespace _seq {
2427
template <class... Sndrs>
@@ -96,7 +99,7 @@ namespace exec {
9699
// result is that the first sender in `sndrs` is not moved from, but the rest are.
97100
_ops.template emplace_from_at<0>(
98101
stdexec::connect,
99-
stdexec::__tup::get<0>(static_cast<CvrefSndrs&&>(sndrs)),
102+
sndrs.template __get<0>(static_cast<CvrefSndrs&&>(sndrs)),
100103
_rcvr_t<0>{this});
101104
}
102105

@@ -107,7 +110,7 @@ namespace exec {
107110
if constexpr (Idx == sizeof...(Sndrs) + 1) {
108111
stdexec::set_value(static_cast<Rcvr&&>(_rcvr), static_cast<Args&&>(args)...);
109112
} else {
110-
auto& sndr = stdexec::__tup::get<Idx>(_sndrs);
113+
auto& sndr = _sndrs.template __get<Idx>(_sndrs);
111114
auto& op = _ops.template emplace_from_at<Idx>(
112115
stdexec::connect, std::move(sndr), _rcvr_t<Idx>{this});
113116
stdexec::start(op);
@@ -197,7 +200,7 @@ namespace exec {
197200
template <class... Sndrs>
198201
requires(sizeof...(Sndrs) > 1) && stdexec::__domain::__has_common_domain<Sndrs...>
199202
STDEXEC_ATTRIBUTE((host, device)) _sndr<Sndrs...> sequence_t::operator()(Sndrs... sndrs) const {
200-
return _sndr<Sndrs...>{{}, {}, {{static_cast<Sndrs&&>(sndrs)}...}};
203+
return _sndr<Sndrs...>{{}, {}, {static_cast<Sndrs&&>(sndrs)...}};
201204
}
202205
} // namespace _seq
203206

@@ -215,3 +218,5 @@ namespace std {
215218
using type = stdexec::__m_at_c<I, exec::sequence_t, stdexec::__, Sndrs...>;
216219
};
217220
} // namespace std
221+
222+
STDEXEC_PRAGMA_POP()

include/exec/sequence/any_sequence_of.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ namespace exec {
6767
template <class _Rcvr>
6868
requires sequence_receiver_of<_Rcvr, __item_types>
6969
&& (__callable<__query_vfun_fn<_Rcvr>, _Queries> && ...)
70-
STDEXEC_MEMFN_DECL(
71-
auto __create_vtable)(this __mtype<__t>, __mtype<_Rcvr>) noexcept -> const __t* {
70+
STDEXEC_MEMFN_DECL(auto __create_vtable)(this __mtype<__t>, __mtype<_Rcvr>) noexcept
71+
-> const __t* {
7272
static const __t __vtable_{
7373
{__rcvr_next_vfun_fn<_Rcvr>{}(static_cast<_NextSigs*>(nullptr))},
7474
{__any_::__rcvr_vfun_fn(
@@ -182,8 +182,8 @@ namespace exec {
182182

183183
template <class _Sender>
184184
requires sequence_sender_to<_Sender, __receiver_ref_t>
185-
STDEXEC_MEMFN_DECL(
186-
auto __create_vtable)(this __mtype<__t>, __mtype<_Sender>) noexcept -> const __t* {
185+
STDEXEC_MEMFN_DECL(auto __create_vtable)(this __mtype<__t>, __mtype<_Sender>) noexcept
186+
-> const __t* {
187187
static const __t __vtable_{
188188
{*__create_vtable(__mtype<__query_vtable_t>{}, __mtype<_Sender>{})},
189189
[](void* __object_pointer, __receiver_ref_t __receiver)

0 commit comments

Comments
 (0)