最終更新日時(UTC):
が更新

履歴 編集

class
<execution>

std::execution::parallel_scheduler(C++26)

namespace std::execution {
  class parallel_scheduler { unspecified };
}

概要

parallel_schedulerは、実行制御ライブラリ上でタスクの並列実行を可能とする並列Schedulerである。

parallel_schedulerはシステムグローバルなスレッドプール(実行リソース)に関連付けられ、schedule操作により得られるSenderはスレッドプールに属する任意のスレッド(実行エージェント)上で実行される。

下記のSenderアルゴリズムに対してカスタマイズ実装を提供することで、タスクの一括(bulk)実行をスレッドプールを利用したタスク並列(parallel)実行に変換する。

execution::system_context_replaceability 名前空間で定義されるインタフェースを介して、スレッドプール実装をユーザ定義の並列Schedulerバックエンドに置き換えることもできる。

クラス仕様

parallel_schedulerschedulerのモデルである。

説明用のschparallel_scheduler型のオブジェクト、schptrと関連付けられるときBACKEND-OF(sch)*ptrとする。

get_forward_progress_guarantee(sch)forward_progress_guarantee::parallelを返す。

説明用のsch2parallel_scheduler型のオブジェクトとしたとき、BACKEND-OF(sch)BACKEND-OF(sch2)が同一オブジェクトを指す場合に限って、2つのオブジェクトschsch2は等しい。

rcvrReceiverとしたとき、基底Bを持つrcvrのプロキシは下記を満たすB型の左辺値rとなる。

  • r.set_value()は、set_value(std::move(rcvr))と同じ効果。
  • r.set_error(e)は、eexception_ptrとして、set_error(std::move(rcvr), std::move(e))と同じ効果。
  • r.set_stopped()は、set_stopped(std::move(rcvr))と同じ効果。

プロキシrに対する事前確保バックエンドストレージ(preallocated backend storage)は、span<byte>型のオブジェクトsであり、rに対してset_valueset_errorset_stoppedいずれかが呼び出されるまで範囲sは有効かつ上書き可能である。

呼び出し可能オブジェクトfと引数argを持つrcvrのバルクチャンク化プロキシ(bulk chunked proxy)は、基底 system_context_replaceability::bulk_item_receiver_proxyを持つrcvrのプロキシrであり、インデクスi, jに対するr.execute(i, j)f(i, j, args...)と同じ効果を持つ。

呼び出し可能オブジェクトfと引数argを持つrcvrのバルク非チャンク化プロキシ(bulk unchunked proxy)は、基底 system_context_replaceability::bulk_item_receiver_proxyを持つrcvrのプロキシrであり、インデクスiに対するr.execute(i, i + 1)f(i, args...)と同じ効果を持つ。

scheduleアルゴリズム

説明用のbBACKEND-OF(sch)sndrschedule(sch)が返すオブジェクト、rcvrReceiverとする。rcvrsndr接続(connect)され、結果のOperation State開始(start)されたとき、

  • sndrが値完了するならば、b.schedule(r, s)が呼ばれる。このとき、
  • 他の全ての完了操作は、変更なしに転送される。

bulk_chunkedアルゴリズム

parallel_schedulerbulk_chunkedアルゴリズムのカスタマイズ実装を提供する。Receiverrcvrbulk_chunked(sndr, pol, shape, f)が返すSender接続(connect)され、結果のOperation State開始(start)されたとき、

  • sndrが値valsで値完了するならば、argsvalsを指す左辺値式のパックとして、b.schedule_bulk_chunked(shape, r, s)が呼ばれる。このとき、
    • rは呼び出し可能オブジェクトfと引数argを持つrcvrのバルクチャンク化プロキシであり、かつ
    • srに対する事前確保バックエンドストレージである。
  • 他の全ての完了操作は、変更なしに転送される。

bulk_unchunkedアルゴリズム

parallel_schedulerbulk_unchunkedアルゴリズムのカスタマイズ実装を提供する。Receiverrcvrbulk_unchunked(sndr, pol, shape, f)が返すSender接続(connect)され、結果のOperation State開始(start)されたとき、

  • sndrが値valsで値完了するならば、argsvalsを指す左辺値式のパックとして、b.schedule_bulk_unchunked(shape, r, s)が呼ばれる。このとき、
    • rは呼び出し可能オブジェクトfと引数argを持つrcvrのバルク非チャンク化プロキシであり、かつ
    • srに対する事前確保バックエンドストレージである。
  • 他の全ての完了操作は、変更なしに転送される。

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

int main()
{
  ex::scheduler auto sch = ex::get_parallel_scheduler();
  static_assert(std::same_as<decltype(sch), ex::parallel_scheduler>);
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照