最終更新:
mikk_ni3_92 2008年06月10日(火) 14:26:19履歴
現在地 >> メニュー >> TBB >> TBB::基本編04::parallel_reduce
リダクション演算を行う場合「parallel_reduce」を使う事ができる。
(※sum()やmax()など、要素全体をまわる場合)
[並列したい例]:ある配列の合計
例えば、A+B+C+D+E+F...を計算する時、( (A+B) + (C+D) ) + ( (E+F)...のような計算する。
つまり、
コンストラクタは2つ用意する。
書き方は
[例]
※初期化子リストで、変数は初期化している。
この関数で、範囲を分割して計算した合計を集める
[例]
※引数は「const参照」。
サンプルコード → TBB::parallel_reduce (3の倍数の数を合計する)
リダクション演算を行う場合「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)...のような計算する。
つまり、
- それぞれの範囲で計算
- それぞれの計算結果を集めてゆく
コンストラクタは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){}
... ...
};
※初期化子リストで、変数は初期化している。
この関数で、範囲を分割して計算した合計を集める
[例]
class TbbSumFromAry //並列処理で加算するクラス
{
//join関数
void join(const TbbSumFromAry &SplitTbb) //const参照
{
SplitSum += SplitTbb.SplitSum; //結合
}
... ...
}
※引数は「const参照」。
サンプルコード → TBB::parallel_reduce (3の倍数の数を合計する)