Range
[req.range]
Range (範囲) は 2 つの部分に再帰的に再分割することができます。再分割には、Range の分割コンストラクターを呼び出します。 次の 2 つの分割コンストラクターがあります:
基本分割コンストラクター。このコンストラクターでは分割範囲はできるだけ等しい大きさになることが推奨されますが、必須ではありません。できるだけ等しくなるように分割することが最良の並列処理につながります。
比例分割コンストラクター。このコンストラクターはオプションであり省略できます。この種のコンストラクターを使用して最適な結果を得るには、必要に応じて指定した割合を最も近い整数に丸めてください。
理想的には、それ以上分割するよりもシリアルに実行するほうが効率良い大きさになるまで再帰分割します。Range のワーク量はより上位レベルのコンテキストに依存します。したがって、Range をモデル化する典型的なタイプは、分割する大きさを制御する方法を提供すべきです。例えば、blocked_range テンプレート・クラスには、それ以上分割できない最も大きな範囲を示す grainsize パラメーターがあります。
値のセットに方向性がある場合、慣例として分割コンストラクターは範囲の 2 番目の部分を作成して、範囲の最初の部分になるように引数を更新します。この規則に従うと、シリアルに実行する場合、parallel_for、parallel_reduce、および parallel_scan アルゴリズムは通常のシーケンシャル・ループが増加する順番で範囲全体にわたって動作します。
Range は、分割コンストラクターとコピー・コンストラクターを宣言しているため、デフォルト・コンストラクターが自動的に生成されることはありません。プログラムで Range タイプのインスタンスを作成する場合、デフォルトのコンストラクターを明示的に定義するか、ほかのコンストラクターを追加する必要があります。
R タイプは、次の要件を満たす場合に Range の要件を満たします:
Range の要件: 擬似署名、セマンティクス
- R::~R()
デストラクター。
- bool R::empty() const
範囲が空の場合は true です。
- bool R::is_divisible() const
範囲を 2 つのサブ範囲に分割できる場合は true です。
- R::R(R &r, proportional_split proportion)
オプションです。比例分割コンストラクター。
r
をproportion
に応じて 2 つのサブ範囲に分割します。
参照: