#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 );
// キャパシティー
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 ) | 詳細 |
| blocked_range( blocked_range& range, split ) | 詳細 |
| 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 |
戻り値: 範囲の排他的な上限。 |