現在地 >> メニュー >> TBB >> TBB::基本編04::parallel_reduce

parallel_reduce


リダクション演算を行う場合「parallel_reduce」を使う事ができる。
(※sum()やmax()など、要素全体をまわる場合)


[並列したい例]:ある配列の合計

int all;
int ary[N];
for(int i = 1; i < N ; ++i)
{
        all += ary[i];  
}

仕組み


例えば、A+B+C+D+E+F...を計算する時、( (A+B) + (C+D) ) + ( (E+F)...のような計算する。

つまり、
  1. それぞれの範囲で計算
  2. それぞれの計算結果を集めてゆく
という事を行う。

使い方


parallel_reduceを使う場合、クラスの中に以下を定義する。
  • コンストラクタ
  • 分割コンストラクタ
  • オペレータ「()」の設定
  • join関数 (結果を集める関数)

コンストラクタ、分割コンストラクタ


コンストラクタは2つ用意する。
  • ひとつは通常のコンストラクタ。
  • もうひとつは「分割コンストラクタ」。(これは範囲を分割した時につかってるはず...)

書き方は
[クラス名](クラス名 & 変数名 , split)
と書く。

[例]

class TbbSumFromAry //並列処理で加算するクラス
{
private:
	double *Ary; //処理データ

public:
	double SplitSum; //合計が集まる

	//コンストラクタ
	TbbSumFromAry(double *InputAry):Ary(InputAry),SplitSum(0){} //全体0で初期化

	//分割コンストラクタ、分割先でも初期化
	TbbSumFromAry(TbbSumFromAry &SplitTbb, tbb::split) : Ary(SplitTbb.Ary),SplitSum(0){}
	... ...

};


※初期化子リストで、変数は初期化している。

join関数


この関数で、範囲を分割して計算した合計を集める

[例]

class TbbSumFromAry //並列処理で加算するクラス
{
	//join関数
	void join(const TbbSumFromAry &SplitTbb) //const参照
	{
		SplitSum += SplitTbb.SplitSum; //結合
	}
	... ...
}


※引数は「const参照」。


サンプルコード → TBB::parallel_reduce (3の倍数の数を合計する)

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます