blocked_range テンプレート・クラス

概要

再帰的に分割可能な半開区間用のテンプレート・クラス。

ヘッダー

#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 コンセプトをモデル化します。

blocked_range の Value コンセプト

擬似署名

意味

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 を選択する推奨手順を次に示します。

  1. grainsize 引数を 10,000 に設定します。この値は、すべてのループボディーでスケジューラー・オーバーヘッドの影響を考慮する必要がない高い値ですが、不必要に並列処理を制限します。
  2. アルゴリズムを 1 つのプロセッサーで実行します。
  3. grainsize 引数を半分にしていき、値が少なくなるにつれ、どの程度アルゴリズムの速度が遅くなるかを確認します。

約 5 から 10% 遅くなる値が、汎用的に利用可能な設定です。

ヒント

blocked_range [i,j)j<i の場合、すべてのメソッドで動作が指定されているとは限りません。しかし、j<i の場合でも、多くのメソッドで、parallel_forparallel_reduce、および parallel_scan がシリアルループ for( Value index=i; index<j; ++index )... と同じ反復空間上を反復する動作が指定されています。TBB_USE_ASSERT が非ゼロの場合、動作が指定されていないメソッドではアサーション・エラーが発生します。

サンプル

blocked_range<Value> は、通常、ループ・テンプレートの範囲引数として使用されます。parallel_forparallel_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

戻り値: 範囲の排他的な上限。

関連情報