std::execution::bulk, std::execution::bulk_chunked, std::execution::bulk_unchunked
| ヘッダ <execution> で定義 |
||
| std::execution::sender auto bulk( std::execution::sender auto input, |
(1) | (C++26以降) |
| std::execution::sender auto bulk_chunked( std::execution::sender auto input, |
(2) | (C++26以降) |
| std::execution::sender auto bulk_unchunked( std::execution::sender auto input, |
(3) | (C++26以降) |
目次 |
[編集] パラメータ
| input | - | 実行されると、function が実行される値を送信する sender |
| policy | - | function/function2 にアタッチされた 実行ポリシー |
| 関数 | - | 入力 sender によって送信される値も引数として渡され、範囲 [0, size) の各インデックスに対して呼び出される呼び出し可能オブジェクト |
| function2 | - | function と同様ですが、インデックスのペア (b, e) で呼び出され、b < e となります。これにより、範囲 [[0, size) の各インデックス i に対して、function2 が b <= i < e となるようにちょうど1回呼び出されます。 |
[編集] 戻り値
入力 sender によって記述されたタスクグラフを記述する sender を返します。これに、指定された関数を範囲 [0, size) のインデックスで呼び出し、入力 sender から送信された値も引数として渡すノードが追加されます。
function/function2 の実行は、返された sender が開始されるまで開始されないことが保証されています。
[編集] エラー完了
input によって渡されたすべてエラーは転送されます。
さらに、sender は std::exception_ptr エラーで完了することが許可されており、そのエラーは以下を含みます。
- function によってスローされた例外
- 必要なリソースの割り当てに失敗した場合の std::bad_alloc
- その他の内部エラー(例:実行コンテキストから呼び出し元への例外の伝播に失敗した場合)のための std::runtime_error から派生した例外。
[編集] キャンセル
カスタマイズされていない `std::execution::bulk`、`std::execution::bulk_chunk`、および `std::execution::bulk_unchunked` は、input からの停止完了シグナルを転送します。これらは停止完了シグナルを生成するための追加のメカニズムを提供しません。
[編集] 注意
`std::execution::bulk` および `std::execution::bulk_chunked` を呼び出す場合、function/function2 の異なる呼び出しが同じ実行エージェント上で発生する可能性があります。
`std::execution::bulk_unchunked` を呼び出す場合、function の異なる呼び出しは、異なる実行エージェント上で発生する必要があります。
`std::execution::bulk` のデフォルト実装は `std::execution::bulk_chunked` に基づいています。`std::execution::bulk` のカスタマイズは可能ですが、ほとんどの場合 `std::execution::bulk_chunked` のみがカスタマイズされることが予想されます。
`std::execution::bulk` および `std::execution::bulk_chunked` のカスタマイズがない場合、`std::execution::bulk` および `std::execution::bulk_chunk` の動作は `function` をシリアルに実行することであり、これはあまり有用ではありません。実装は、異なるスケジューラで `std::execution::bulk` および `std::execution::bulk_chunked` を実行することをより有用にするカスタマイズを持つことが期待されます。
`std::execution::bulk_unchunked` は、function が異なる呼び出し間で依存関係を持つ可能性があり、同時実行の進行保証(並列進行保証だけでは不十分)を必要とする場合に意味があります。サイズ 1000 で `std::execution::bulk_unchunked` を実行するには、1000 の実行エージェント(例:スレッド)が同時に実行される必要があります。
`std::execution::bulk_unchunked` は、function が同時に実行できることが期待されているため、実行ポリシーを必要としません。
[編集] 例
`execution::bulk` の可能な使用法。
std::vector<double> x; std::vector<double> y; //... sender auto process_elements = just(get_coefficient()) | bulk(x.size(), [&](size_t i, double a) { y[i] = a * x[i] + y[i]; }); // process_elements describes the work described by calling a function to // get a coefficient `a`, and using it to execute // y[i] = a * x[i] + y[i] // for each `i` in range [0, x.size())
`execution::bulk_chunked` の可能な使用法。
std::vector<std::uint32_t> data = ...; std::atomic<std::uint32_t> sum{0}; sender auto s = bulk_chunked(just(), par, 100000, [&sum, &data](int begin, int end) { auto partial_sum = std::accumulate(data.begin() + begin, data.begin() + end, 0U); sum.fetch_add(partial_sum); }); // the atomic object will not be touched 100000 times; will execute faster than bulk()