22.12 Execution policies (execpol)
編集22.12.1 In general (execpol.general)
編集この小節では、execution policy typesのクラスについて説明しています。execution policy typeのオブジェクトは、アルゴリズムの実行に許可される並列処理の種類を示し、要素アクセス関数に対する結果としての要求を表現します。
- 例 1
using namespace std; vector<int> v = /* ... */; // 標準の順次ソート sort(v.begin(), v.end()); // 明示的な順次ソート sort(execution::seq, v.begin(), v.end()); // 並列実行を許可 sort(execution::par, v.begin(), v.end()); // ベクトル化も許可 sort(execution::par_unseq, v.begin(), v.end());
- 注意 1
- 実装は、この標準で説明されているもの以外にも、効率的な実行のために特異なパラメータを必要とする並列アーキテクチャに対応する追加のexecution policyを拡張として提供することができます。
22.12.2 Header <execution> synopsis (execution.syn)
編集namespace std { // 22.12.3, execution policy type trait template<class T> struct is_execution_policy; template<class T> constexpr bool is_execution_policy_v = is_execution_policy<T>::value; } namespace std::execution { // 22.12.4, sequenced execution policy class sequenced_policy; // 22.12.5, parallel execution policy class parallel_policy; // 22.12.6, parallel and unsequenced execution policy class parallel_unsequenced_policy; // 22.12.7, unsequenced execution policy class unsequenced_policy; // 22.12.8, execution policy objects inline constexpr sequenced_policy seq{ unspecified }; inline constexpr parallel_policy par{ unspecified }; inline constexpr parallel_unsequenced_policy par_unseq{ unspecified }; inline constexpr unsequenced_policy unseq{ unspecified }; }
22.12.3 Execution policy type trait (execpol.type)
編集template<class T> struct is_execution_policy { see below };
- 説明:
is_execution_policy
は、曖昧なオーバーロード解決から関数シグネチャを除外する目的でexecution policyを検出するために使用されます。
- 特性:
is_execution_policy<T>
は、Tが標準または実装定義のexecution policyのタイプである場合はtrue_type
を、そうでない場合はfalse_type
を基底特性とするCpp17UnaryTypeTraitです。
- 注意 1
- この規定は、非標準のexecution policyを作成する特権をライブラリ実装に留保します。
- 特化の禁止:
is_execution_policy
に対して特化を追加するプログラムの動作は未定義です。
Cpp17UnaryTypeTraitとは? |
C++17で導入されたUnaryTypeTrait は、テンプレートパラメータの型に関する情報を取得するためのテンプレートクラス群です。従来のstd::is_integral のような型判定トレイトに加え、より詳細な型情報にアクセスできるようになっています。
|
22.12.4 Sequenced execution policy (execpol.seq)
編集class execution::sequenced_policy { unspecified };
- 説明:
execution::sequenced_policy
クラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化されないことを要求するための一意のタイプとして使用されます。
- 例外処理:
execution::sequenced_policy
ポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminate
が呼び出されます(14.6.2)。
22.12.5 Parallel execution policy (execpol.par)
編集class execution::parallel_policy { unspecified };
- 説明:
execution::parallel_policy
クラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化される可能性があることを示すための一意のタイプとして使用されます。
- 例外処理:
execution::parallel_policy
ポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminate
が呼び出されます(14.6.2)。
22.12.6 Parallel and unsequenced execution policy (execpol.parunseq)
編集class execution::parallel_unsequenced_policy { unspecified };
- 説明:
execution::parallel_unsequenced_policy
クラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化およびベクトル化される可能性があることを示すための一意のタイプとして使用されます。
- 例外処理:
execution::parallel_unsequenced_policy
ポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminate
が呼び出されます(14.6.2)。
22.12.7 Unsequenced execution policy (execpol.unseq)
編集class execution::unsequenced_policy { unspecified };
- 説明:
unsequenced_policy
クラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行がベクトル化される可能性があることを示すための一意のタイプとして使用されます。例えば、単一スレッド上で複数のデータ項目に対して動作する命令を使用して実行されます。
- 例外処理:
execution::unsequenced_policy
ポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminate
が呼び出されます(14.6.2)。
22.12.8 Execution policy objects (execpol.objects)
編集inline constexpr execution::sequenced_policy execution::seq{ unspecified }; inline constexpr execution::parallel_policy execution::par{ unspecified }; inline constexpr execution::parallel_unsequenced_policy execution::par_unseq{ unspecified }; inline constexpr execution::unsequenced_policy execution::unseq{ unspecified };
- 説明:
<execution>
ヘッダーには、各タイプのexecution policyに関連付けられたグローバルオブジェクトが宣言されています。