Skip to content

Commit 3b295e4

Browse files
committed
execution/parallel_scheduler: P3804R2対応
1 parent a22cc94 commit 3b295e4

3 files changed

Lines changed: 48 additions & 15 deletions

File tree

reference/execution/execution/parallel_scheduler.md

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,38 @@ namespace std::execution {
4242
4343
プロキシ`r`に対する事前確保バックエンドストレージ(preallocated backend storage)は、[`span`](/reference/span/span.md)`<`[`byte`](/reference/cstddef/byte.md)`>`型のオブジェクト`s`であり、`r`に対して[`set_value`](set_value.md)/[`set_error`](set_error.md)/[`set_stopped`](set_stopped.md)いずれかが呼び出されるまで範囲`s`は有効かつ上書き可能である。
4444
45-
呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルクチャンク化プロキシ(bulk chunked proxy)は、基底
46-
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`, `j`に対する`r.execute(i, j)`は`f(i, j, args...)`と同じ効果を持つ。
45+
式[`get_domain`](get_domain.md)`(sch)`は、下記と等価な説明専用の型`parallel-scheduler-domain`の式を返す。
4746
48-
呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルク非チャンク化プロキシ(bulk unchunked proxy)は、基底
49-
[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシ`r`であり、インデクス`i`に対する`r.execute(i, i + 1)`は`f(i, args...)`と同じ効果を持つ。
47+
```cpp
48+
struct parallel-scheduler-domain {
49+
template<sender-for<bulk_chunked_t> Sndr, queryable Env>
50+
static constexpr decltype(auto)
51+
transform_sender(set_value_t, Sndr&& sndr, const Env& env) const noexcept {
52+
return see below;
53+
}
54+
template<sender-for<bulk_unchunked_t> Sndr, queryable Env>
55+
static constexpr decltype(auto)
56+
transform_sender(set_value_t, Sndr&& sndr, const Env& env) const noexcept {
57+
return see below;
58+
}
59+
};
60+
```
61+
* sender-for[link sender-for.md]
62+
* queryable[link ../queryable.md]
63+
* set_value_t[link set_value.md]
64+
65+
上記`transform_sender`の引数`sndr`に対して、説明用の変数`child`, `pol`, `shape`, `f`を下記の通り宣言する。
66+
67+
```cpp
68+
auto& [_, data, child] = sndr;
69+
auto& [pol, shape, f] = data;
70+
```
71+
72+
説明用の`p`を下記とする。
73+
74+
-`pol`の型がCV修飾された[`parallel_policy`](execution_policy.md)または[`parallel_unsequenced_policy`](execution_policy.md)のとき、`true`
75+
- `pol`が処理系定義の[実行ポリシー](execution_policy.md)のとき、処理系定義の値。
76+
- そうでなければ、`false`
5077

5178

5279
### `schedule`アルゴリズム
@@ -59,19 +86,19 @@ namespace std::execution {
5986

6087

6188
### `bulk_chunked`アルゴリズム
62-
`parallel_scheduler`は[`bulk_chunked`](bulk_chunked.md)アルゴリズムのカスタマイズ実装を提供する。[Receiver](receiver.md)`rcvr`が`bulk_chunked(sndr, pol, shape, f)`が返す[Sender](sender.md)に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
89+
タグ`bulk_chunked`[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
6390

64-
- `sndr`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_chunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_chunked.md)`(shape, r, s)`が呼ばれる。このとき、
65-
- `r`は呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルクチャンク化プロキシであり、かつ
91+
- `child`が値`vals`で値完了するならば、`args``vals`を指す左辺値式のパックとして、[`b.schedule_bulk_chunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_chunked.md)`(p ? shape : 1, r, s)`が呼ばれる。このとき、
92+
- `r`は基底クラス[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシであり、インデックス`i`, `j`に対して`r.execute(i, j)``p``true`のとき`f(i, j, args...)`、そうでないときは`f(0, shape, args...)`と等価な効果を持つ。かつ
6693
- `s``r`に対する事前確保バックエンドストレージである。
6794
- 他の全ての完了操作は、変更なしに転送される。
6895

6996

7097
### `bulk_unchunked`アルゴリズム
71-
`parallel_scheduler`は[`bulk_unchunked`](bulk_unchunked.md)アルゴリズムのカスタマイズ実装を提供する。[Receiver](receiver.md)`rcvr`が`bulk_unchunked(sndr, pol, shape, f)`が返す[Sender](sender.md)に[接続(connect)](connect.md)され、結果の[Operation State](operation_state.md)が[開始(start)](start.md)されたとき、
98+
タグ`bulk_unchunked`[Sender](sender.md)を受け付ける`transform_sender`オーバーロードは、[Receiver](receiver.md)`rcvr`[接続(connect)](connect.md)され結果の[Operation State](operation_state.md)[開始(start)](start.md)されたとき、下記動作を行うSenderを返す。
7299

73-
- `sndr`が値`vals`で値完了するならば、`args`を`vals`を指す左辺値式のパックとして、[`b.schedule_bulk_unchunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(shape, r, s)`が呼ばれる。このとき、
74-
- `r`は呼び出し可能オブジェクト`f`と引数`arg`を持つ`rcvr`のバルク非チャンク化プロキシであり、かつ
100+
- `child`が値`vals`で値完了するならば、`args``vals`を指す左辺値式のパックとして、[`b.schedule_bulk_unchunked`](system_context_replaceability/parallel_scheduler_backend/schedule_bulk_unchunked.md)`(p ? shape : 1, r, s)`が呼ばれる。このとき、
101+
- `r`は基底クラス[`system_context_replaceability::bulk_item_receiver_proxy`](system_context_replaceability/bulk_item_receiver_proxy.md)を持つ`rcvr`のプロキシであり、インデックス`i`に対して`r.execute(i, i + 1)``p``true`のとき`f(i, args...)`、そうでないときは`for (decltype(shape) i = 0; i < shape; i++) { f(i, args...); }`と等価な効果を持つ。かつ
75102
- `s``r`に対する事前確保バックエンドストレージである。
76103
- 他の全ての完了操作は、変更なしに転送される。
77104

@@ -116,3 +143,4 @@ int main()
116143
## 参照
117144
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)
118145
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)
146+
- [P3804R2 Iterating on `parallel_scheduler`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3804r2.html)

reference/execution/execution/system_context_replaceability/receiver_proxy.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ namespace std::execution::system_context_replaceability {
1818
1919
| 名前 | 説明 | 対応バージョン |
2020
|------|------|----------------|
21-
| `virtual ~receiver_proxy() = default;` | デストラクタ | C++26 |
2221
| `virtual void set_value() noexcept = 0;` | 値完了ハンドラ | C++26 |
2322
| `virtual void set_error(exception_ptr) noexcept = 0;` | エラー完了ハンドラ | C++26 |
2423
| `virtual void set_stopped() noexcept = 0;` | 停止完了ハンドラ | C++26 |
@@ -42,3 +41,4 @@ namespace std::execution::system_context_replaceability {
4241
4342
## 参照
4443
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)
44+
- [P3804R2 Iterating on `parallel_scheduler`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3804r2.html)

reference/execution/execution/system_context_replaceability/receiver_proxy/try_query.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
```cpp
99
template<class P, class-type Query>
10-
optional<P> try_query(Query q) noexcept;
10+
optional<P> try_query(Query q) const noexcept;
1111
```
1212
* class-type[link ../../../class-type.md]
1313
* optional[link /reference/optional/optional.md]
@@ -22,19 +22,23 @@ optional<P> try_query(Query q) noexcept;
2222
2323
## 戻り値
2424
説明用の`env`を`*this`が表現する[Receiver](../../receiver.md)の環境とする。
25-
下記を満たす場合は[`nullopt`](/reference/optional/nullopt_t.md)を返す。そうでなければ、`q(env)`を返す。
25+
下記を満たす場合は[`nullopt`](/reference/optional/nullopt_t.md)を返す。
2626
2727
- `Query`が実装定義でサポートされるクエリ集合のメンバではない、または
2828
- `P`が実装定義でサポートされる`Query`の結果型集合のメンバではない、または
29-
- 式`q(env)`が適格でないか、cv修飾された`P`型を持たない。
29+
- 式`q(env)`が適格でない。
30+
31+
そうではなく、`q(env)`がCV修飾された`P`型を持つときは`q(env)`を返す。そうでなければ、[`optional`](/reference/optional/optional.md)`<P>`型の実装定義の値を返す。
3032
3133
3234
## 例外
3335
投げない
3436
3537
3638
## 備考
37-
[`get_stop_token_t`](../../../get_stop_token.md)は実装定義でサポートるクエリ集合に含まれ、[`inplace_stop_token`](/reference/stop_token/inplace_stop_token.md)は`get_stop_token_t`の実装定義でサポートされる結果型集合のメンバである。
39+
[`get_stop_token_t`](../../../get_stop_token.md)は実装定義でサポートするクエリ集合に含まれ、[`inplace_stop_token`](/reference/stop_token/inplace_stop_token.md)は`get_stop_token_t`の実装定義でサポートされる結果型集合のメンバである。
40+
41+
推奨実装:`P`が[`inplace_stop_token`](/reference/stop_token/inplace_stop_token.md)であり型`T`が[`stoppable_token`](/reference/stop_token/stoppable_token.md)をモデル化する`inplace_stop_token`以外の型である場合、`try_query`は、`*this`に対して`set_value`/`set_error`/`set_stopped`のいずれかが呼び出されるまで全ての`try_query`呼び出しが`inplace_stop_token`オブジェクトと等価なオブジェクトを返す、`inplace_stop_token`型のオブジェクトを返すべき。
3842
3943
4044
## バージョン
@@ -55,3 +59,4 @@ optional<P> try_query(Query q) noexcept;
5559
5660
## 参照
5761
- [P2079R10 Parallel scheduler](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2079r10.html)
62+
- [P3804R2 Iterating on `parallel_scheduler`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3804r2.html)

0 commit comments

Comments
 (0)