Skip to content

Latest commit

 

History

History
133 lines (101 loc) · 6.65 KB

File metadata and controls

133 lines (101 loc) · 6.65 KB

bulk

  • execution[meta header]
  • cpo[meta id-type]
  • std::execution[meta namespace]
  • cpp26[meta cpp]
namespace std::execution {
  struct bulk_t { unspecified };
  inline constexpr bulk_t bulk{};
}
  • unspecified[italic]

概要

bulkは、インデクス空間の各インデクスに対してタスクを一括実行するSenderアダプタである。

bulkパイプ可能Senderアダプタオブジェクトであり、パイプライン記法をサポートする。

実行制御ライブラリのデフォルト動作では、bulkbulk_chunkedに変換され、下記のように振る舞う。

  • 並列Scheduler上では、インデクス空間を区間分割されたチャンク単位で並列実行される。
  • 明示的にカスタマイズされていなければ、各インデクスに対する処理は逐次実行される。

効果

説明用の式sndr, policy, shape, fに対して、型Policyremove_cvref_t<decltype(policy)>、型Shapedecltype(auto(shape))、型Funcdecay_t<decltype((f))>とする。下記いずれかの条件をみたすとき、呼び出し式bulk(sndr, policy, shape, f)は不適格となる。

そうでなければ、呼び出し式bulk(sndr, policy, shape, f)は下記と等価。

make-sender(bulk, product-type<see below, Shape, Func>{policy, shape, f}, sndr)
  • make-sender[link make-sender.md]
  • product-type[link product-type.md]

product-typeの第1テンプレート引数は、Policycopy_constructibleのモデルであるときPolicyとなる。そうでなければ、const Policy&となる。

Senderアルゴリズムタグ bulk

説明用の式sndrenvに対して、型Sndrdecltype((sndr))とする。sender-for<Sndr, bulk_t> == falseのとき、式bulk.transform_sender(sndr, env)は不適格となる。

そうでなければ、式bulk.transform_sender(sndr, env)は下記と等価。

auto [_, data, child] = sndr;
auto& [policy, shape, f] = data;
auto new_f = [func = std::move(f)](Shape begin, Shape end, auto&&... vs)
    noexcept(noexcept(f(begin, vs...))) {
  while (begin != end) func(begin++, vs...);
}
return bulk_chunked(std::move(child), policy, shape, std::move(new_f));
  • bulk_chunked[link bulk_chunked.md]
  • std::move[link /reference/utility/move.md]

カスタマイゼーションポイント

Receiverとの接続(connect)時に、関連付けられた実行ドメインに対してexecution::transform_sender経由でSender変換が行われる。 デフォルト実行ドメインではbulk.transform_sender(set_value, out_sndr, env)が呼ばれ、bulk_chunkedSenderへと変換される。

説明用の式out_sndrbulk(sndr, policy, shape, f)の戻り値Senderとし、式rcvrを式connect(out_sndr, rcvr)が適格となるReceiverとする。式connect(out_sndr, rcvr)開始(start)時に下記を満たす非同期操作を生成しない場合、動作は未定義となる。

  • 説明用のargssndrの値完了結果を参照する左辺値式のパック、またはcopy_constructibleのモデルであるならばそれらの値のdecayコピーのパックとする。sndrが値完了したとき、
    • out_sndrもまた値完了するとき、0からshapeまでの型Shapeの全てのiに対してf(i, args...)を呼び出す。
    • out_sndrset_error(rcvr, eptr)で完了するとき、エラー完了ハンドラが呼び出される前に非同期操作はf呼び出しのサブセットを呼び出す可能性があり、eptrは下記いずれかを指すexception_ptrとなる。
      • f呼び出しから送出された例外、または
      • 処理系が要求リソースの確保に失敗したときはbad_alloc例外、または
      • runtime_errorから派生された例外。
    • out_sndrset_stopped(rcvr)で完了するとき、停止完了ハンドラが呼び出される前に非同期操作はf呼び出しのサブセットを呼び出す可能性がある。
  • sndrset_valueで完了しないとき、その完了操作はrecvに転送される。
  • パラメータpolicyは、アルゴリズムに対応した非同期操作の実行を並列化する方法、およびfに適用する方法を規程する。並列アルゴリズム要素アクセス関数に対する権限と要件はfに適用される。

備考

bulkアルゴリズムを直接カスタマイズしない実行ドメインであっても、bulkの動作はReceiver接続時に変換されるbulk_chunkedへ委譲される。

#include <print>
#include <execution>
namespace ex = std::execution;

int main()
{
  ex::sender auto sndr =
    ex::just()
    | ex::bulk(3, ex::seq, [](int i) {
        std::println("{}", i);
      });
  std::this_thread::sync_wait(sndr);
}
  • ex::bulk[color ff0000]
  • ex::sender[link sender.md]
  • ex::just[link just.md]
  • ex::seq[link execution_policy.md]
  • std::this_thread::sync_wait[link ../this_thread/sync_wait.md]

出力

0
1
2

バージョン

言語

  • C++26

処理系

関連項目

参照