再帰的に分割可能な値のセットを表す型の要件。
次の表は、Range 型 R の要件を示しています。
Range は 2 つの部分に再帰的に再分割することができます。範囲はできるだけ等しい大きさになることが推奨されますが、必須ではありません。 できるだけ等しくなるように分割することが最良の並列処理につながります。 理想的には、それ以上分割するよりもシリアルに実行するほうが効率的な大きさになるまで再帰分割します。 Range によって表現される作業量はより上位レベルのコンテキストに依存します。したがって、Range をモデル化する典型的な型は、分割する大きさを制御する方法を提供すべきです。 例えば、blocked_range テンプレート・クラスには、それ以上分割できない最も大きな範囲を示す grainsize パラメーターがあります。
分割を実装するコンストラクターは、分割コンストラクター と呼ばれます。 値のセットに方向性がある場合、分割コンストラクターは範囲の 2 番目の部分を構築して、最初の半分になるように引数を更新します。 この規定に従うと、シリアルに実行する場合、parallel_for、parallel_reduce、および parallel_scan アルゴリズムは通常のシーケンシャル・ループが増加する順番で範囲全体にわたって動作します。
次のコードは、Range コンセプトをモデル化する TrivialIntegerRange 型を定義します。 この型は、一桁の整数まで分割可能な半開区間 [lower,upper) を表します。
struct TrivialIntegerRange {
int lower;
int upper;
bool empty() const {return lower==upper;}
bool is_divisible() const {return upper>lower+1;}
TrivialIntegerRange( TrivialIntegerRange& r, split ) {
int m = (r.lower+r.upper)/2;
lower = m;
upper = r.upper;
r.upper = m;
}
};
TrivialIntegerRange はデモ用です。粒度パラメーターがないため、あまり実用的ではありません。 代わりに、blocked_range ライブラリー・クラスを使用してください。
blocked_range モデルは、1 次元の範囲をモデル化します。
blocked_range2d モデルは、2 次元の範囲をモデル化します。
blocked_range3d モデルは、3 次元の範囲をモデル化します。
Container Range コンセプトは、範囲としてコンテナーをモデル化します。