再帰的に分割可能な半開区間用のテンプレート・クラス。
#include "tbb/blocked_range.h"
template<typename Value> class blocked_range;
blocked_range<Value> は、再帰的に分割できる半開区間 [i,j) を表します。i および j の型は、次の表の要件をモデル化しなければなりません。表では、型 D は式 "j-i" の型になります。これは、size_t に変換可能な任意の整数型です。Value 要件をモデル化するサンプルは、相違が size_t に暗黙的に型変換できる整数型、ポインター、および STL ランダムアクセス・イテレーターです。
blocked_range は、Range コンセプトをモデル化します。
擬似署名 |
意味 |
---|---|
Value::Value( const Value& ) |
コピー・コンストラクター。 |
Value::~Value() |
デストラクター。 |
void operator=( const Value& ) 注擬似署名の戻り型 void は、operator= は値を返す必要がないことを示します。operator= は値を返すことができますが、blocked_range によって無視されます。 |
代入。 |
bool operator<( const Value& i, const Value& j ) |
値 i は値 j に先行します。 |
D operator-( const Value& i, const Value& j ) |
範囲 [i,j) にある値の数です。 |
Value operator+( const Value& i, D k ) |
i の後の k 番目の値です。 |
blocked_range<Value> は、size_t 型の grainsize を指定します。範囲のサイズが grainsize を超える場合、blocked_range は 2 つのサブ範囲に分割可能です。理想的な粒度は、parallel_for ループ・テンプレート、parallel_reduce ループ・テンプレート、または parallel_scan ループ・テンプレートの典型的な範囲引数である blocked_range<Value> のコンテキストに依存します。粒度が非常に小さい場合、並列処理による速度向上よりもループ・テンプレート内のオーバーヘッドに時間がかかることがあります。粒度が非常に大きい場合、不必要に並列処理を制限することがあります。例えば、粒度が非常に大きいために範囲を 1 回しか分割できない場合、最大の可能な並列処理は 2 になります。
grainsize を選択する推奨手順を次に示します。
約 5 から 10% 遅くなる値が、汎用的に利用可能な設定です。
blocked_range [i,j) で j<i の場合、すべてのメソッドで動作が指定されているとは限りません。しかし、j<i の場合でも、多くのメソッドで、parallel_for、parallel_reduce、および parallel_scan がシリアルループ for( Value index=i; index<j; ++index )... と同じ反復空間上を反復する動作が指定されています。TBB_USE_ASSERT が非ゼロの場合、動作が指定されていないメソッドではアサーション・エラーが発生します。
サンプル
blocked_range<Value> は、通常、ループ・テンプレートの範囲引数として使用されます。parallel_for、parallel_reduce、および parallel_scan のサンプルを参照してください。
namespace tbb { template<typename Value> class blocked_range { public: // 型 typedef size_t size_type; typedef Value const_iterator; // コンストラクター blocked_range( Value begin, Value end, size_type grainsize=1 ); blocked_range( blocked_range& r, split ); blocked_range( blocked_range& r, proportional_split& proportion ); // 比例分割が可能 static const bool is_splittable_in_proportion = true; // キャパシティー size_type size() const; bool empty() const; // アクセス size_type grainsize() const; bool is_divisible() const; // イテレーター const_iterator begin() const; const_iterator end() const; }; }
メンバー | 説明 |
---|---|
size_type |
blocked_range のサイズを測定する型です。型は常に size_t です。 |
const_iterator | 範囲内の値の型です。その名前に反して、const_iterator 型は必ずしも STL イテレーターではありません。上記の表の Value 要件を満たす必要があるだけです。しかし、型が const_iterator である場合、blocked_range は読み取り専用の STL コンテナーのように動作するので、この型を const_iterator と呼ぶと便利です。 |
blocked_range( Value begin, Value end, size_t grainsize=1 ) |
要件: 引数 grainsize が正であること。この要件が満たされない場合、ライブラリーのデバッグバージョンはアサーション・エラーになります。 効果: 指定された grainsize で、半開区間 [begin,end) を表す blocked_range を構築します。 例: "blocked_range<int> r( 5, 14, 2 );" 文は、粒度 2 で、値 5 から 13 までを含む int の範囲を構築します。その後、r.begin()==5 および r.end()==14 に設定します。 |
blocked_range( blocked_range& range, split ) |
基本分割コンストラクター。 要件: is_divisible() が true であること。 効果: range を 2 つのサブ範囲に分割します。新しく構築される blocked_range は、ほぼオリジナルの range の半分で、range は残りになるように更新されます。各サブ範囲の粒度はオリジナルの range の粒度と同じです。 例: r を、粒度 g で半開区間 [i, j) を表す blocked_range とします。blocked_range<int> s(r, split); 文を実行すると、粒度 g で、r は [i, i+(j-i)/2)、s は [i+(j-i)/2, j) を表します。 |
blocked_range( blocked_range& range, proportional_split proportion ) |
比例分割コンストラクター。 要件: is_divisible() が true であること。 効果: range をサイズの比率が proportion.left() と proportion.right() の比率に近い 2 つのサブ範囲に分割します。新しく構築される blocked_range は右のサブ範囲で、range は左のサブ範囲になるように更新されます。 例: r を、粒度 g で半開区間 [i, j) を表す blocked_range とします。blocked_range<int> s(r, proportional_split(2, 3)); 文を実行すると、粒度 g で、r は [i, i+2*(j-i)/(2+3))、s は [i+2*(j-i)/(2+3), j) を表します。 |
static const bool is_splittable_in_proportion | 特別なフィールドで、blocked_range のインスタンスが比例分割可能であることを示します。true に設定します。 |
size_type size() const |
要件: end()<begin() が false であること。 効果: 範囲のサイズを決定します。 戻り値: end()-begin() |
bool empty() const |
効果: 範囲が空かどうかを決定します。 戻り値: !(begin()<end()) |
size_type grainsize() const |
戻り値: 範囲の粒度。 |
bool is_divisible() const |
要件: !(end()<begin()) 効果: 範囲がサブ範囲に分割できるかどうかを決定します。 戻り値: size()>grainsize(); の場合は true。その他の場合は false。 |
const_iterator begin() const |
戻り値: 範囲の包含的な下限。 |
const_iterator end() const |
戻り値: 範囲の排他的な上限。 |