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
のような型判定トレイトに加え、より詳細な型情報にアクセスできるようになっています。
- 主な機能
std::is_same_v
: 2つの型が同一かどうかを判定します。std::is_integral_v
: 型が整数型かどうかを判定します。std::is_floating_point_v
: 型が浮動小数点型かどうかを判定します。std::is_arithmetic_v
: 型が算術型かどうかを判定します (整数型と浮動小数点型を含む)。std::is_fundamental_v
: 型が基底型かどうかを判定します (整数型、浮動小数点型、ポインタ型、参照型を含む)。std::is_void_v
: 型がvoid
型かどうかを判定します。std::is_null_pointer_v
: 型がstd::nullptr_t
型かどうかを判定します。std::is_pointer_v
: 型がポインタ型かどうかを判定します。std::is_lvalue_reference_v
: 型が左辺値参照型かどうかを判定します。std::is_rvalue_reference_v
: 型が右辺値参照型かどうかを判定します。std::is_const_v
: 型がconst修飾されているかどうかを判定します。std::is_volatile_v
: 型がvolatile修飾されているかどうかを判定します。std::remove_cv_t
: 型のconst修飾とvolatile修飾を削除した型を取得します。std::remove_reference_t
: 型の参照修飾を削除した型を取得します。std::add_const_t
: 型にconst修飾を追加した型を取得します。std::add_volatile_t
: 型にvolatile修飾を追加した型を取得します。std::add_lvalue_reference_t
: 型に左辺値参照修飾を追加した型を取得します。std::add_rvalue_reference_t
: 型に右辺値参照修飾を追加した型を取得します。std::is_same_v<T, std::decay_t<U>>
: 型T
がU
の型抽出結果と同一かどうかを判定します (詳細はstd::decay_t
を参照)。std::is_convertible_v<T, U>
: 型T
が型U
に変換可能かどうかを判定します。
- 使い方
UnaryTypeTrait
はテンプレートパラメータとして使用します。例えば、以下のコードは、T
が整数型かどうかを判定し、その結果に応じて処理を分岐しています。
template <typename T> void process(T value) { if constexpr (std::is_integral_v<T>) { // Tが整数型の場合の処理 } else { // Tが整数型でない場合の処理 } }
- 利点
- コンパイル時に型情報を検査することで、より効率的なコードを書けるようになります。
- テンプレートコードをより汎用的にすることができます。
- コンパイルエラーメッセージをより明確にすることができます。
- 注意点
UnaryTypeTrait
はC++17以降で使用可能なので、古いコンパイラでは使用できません。- テンプレートパラメータの型がコンパイル時に不明な場合は、
UnaryTypeTrait
は使用できません。
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に関連付けられたグローバルオブジェクトが宣言されています。