最終更新:
mikk_ni3_92 2008年06月10日(火) 14:27:57履歴
現在地 >> メニュー >> TBB >> TBB::parallel_reduce
#include <iostream> #include <vector> #include <algorithm> #include <tbb/task_scheduler_init.h> #include <tbb/blocked_range.h> #include <tbb/parallel_reduce.h> //-------- 各種外部変数 --------// const int ElementNum = 30; //-------- プロトタイプ宣言 ----------------// int Get3timesNumber(int data); //--------- TBB用のクラス ---------// class TbbSumFromAry //並列処理で加算する { private: int *Ary; public: int SplitSum; //合計が集まる //コンストラクタ TbbSumFromAry(int *InputAry):Ary(InputAry),SplitSum(0){} //全体0で初期化 //オペレータ void operator()(const tbb::blocked_range<int> &range) { for( int loop = range.begin(); loop != range.end() ; ++loop ){ SplitSum += Get3timesNumber(Ary[loop]); //SplitSumに蓄積 } } //分割コンストラクタ、分割先でも初期化 TbbSumFromAry(TbbSumFromAry &SplitTbb, tbb::split) : Ary(SplitTbb.Ary),SplitSum(0){} //join関数 void join(const TbbSumFromAry &SplitTbb) { SplitSum += SplitTbb.SplitSum; //結合 } }; //3の倍数を返す(他は0を返す) int Get3timesNumber(int data) { if( (data % 3) == 0){ return data; } return 0; } //-------- ここからメイン関数 ---------// int main(int argc,char **argv) { std::vector<int> v(ElementNum); for(int loop = 0; loop < ElementNum;++loop){ v[loop] = loop; //初期化 } TbbSumFromAry TbbCsum(&v[0]); std::copy(v.begin(),v.end(),std::ostream_iterator<int>(std::cout,"\n")); //要素の出力 //---- ここからTbbの処理 ----// tbb::task_scheduler_init Tbb_Init;//Tbb初期化 tbb::parallel_reduce( tbb::blocked_range<int>(0,static_cast<int>( v.size() )),TbbCsum, tbb::auto_partitioner()); //並列化 Tbb_Init.terminate(); //---- Tbb終了 ----// //合計の出力 std::cout <<"3の倍数の合計は : "<< TbbCsum.SplitSum << "\n"; return EXIT_SUCCESS; }