コンテンツにスキップ

C++/標準ライブラリ/execution

出典: フリー教科書『ウィキブックス(Wikibooks)』

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 };
  1. 説明:
    is_execution_policyは、曖昧なオーバーロード解決から関数シグネチャを除外する目的でexecution policyを検出するために使用されます。
  2. 特性:
    is_execution_policy<T>は、Tが標準または実装定義のexecution policyのタイプである場合はtrue_typeを、そうでない場合はfalse_typeを基底特性とするCpp17UnaryTypeTraitです。
注意 1
この規定は、非標準のexecution policyを作成する特権をライブラリ実装に留保します。
  1. 特化の禁止:
    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>>: 型TUの型抽出結果と同一かどうかを判定します (詳細は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 };
  1. 説明:
    execution::sequenced_policyクラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化されないことを要求するための一意のタイプとして使用されます。
  2. 例外処理:
    execution::sequenced_policyポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminateが呼び出されます(14.6.2)。

22.12.5 Parallel execution policy (execpol.par)

[編集]
class execution::parallel_policy { unspecified };
  1. 説明:
    execution::parallel_policyクラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化される可能性があることを示すための一意のタイプとして使用されます。
  2. 例外処理:
    execution::parallel_policyポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminateが呼び出されます(14.6.2)。

22.12.6 Parallel and unsequenced execution policy (execpol.parunseq)

[編集]
class execution::parallel_unsequenced_policy { unspecified };
  1. 説明:
    execution::parallel_unsequenced_policyクラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行が並列化およびベクトル化される可能性があることを示すための一意のタイプとして使用されます。
  2. 例外処理:
    execution::parallel_unsequenced_policyポリシーで並列アルゴリズムを実行中に、要素アクセス関数の呼び出しが例外で終了した場合、terminateが呼び出されます(14.6.2)。

22.12.7 Unsequenced execution policy (execpol.unseq)

[編集]
class execution::unsequenced_policy { unspecified };
  1. 説明:
    unsequenced_policyクラスは、並列アルゴリズムのオーバーロードを区別し、並列アルゴリズムの実行がベクトル化される可能性があることを示すための一意のタイプとして使用されます。例えば、単一スレッド上で複数のデータ項目に対して動作する命令を使用して実行されます。
  2. 例外処理:
    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 };
  1. 説明:
    <execution>ヘッダーには、各タイプのexecution policyに関連付けられたグローバルオブジェクトが宣言されています。