現在地 >> メニュー >> TBB >> TBB::parallel_reduce

問題


int型配列で、3の倍数のものだけを合計せよ。

答え


#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;
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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