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

関連 >> TBB::基本編06::Vector

問題


0〜NUMまでを「tbb::concurrent_vector」に並列処理でpush_backを行え。

答え

#include <iostream>
#include <algorithm>
#include <vector>

#include <tbb/task_scheduler_init.h>
#include <tbb/blocked_range.h>
#include <tbb/parallel_for.h>
#include <tbb/concurrent_vector.h>

typedef tbb::concurrent_vector<int> iTbb_Vec; //長いので省略化
iTbb_Vec TbbVec;  //並列処理用vector


class PrimePush
{
public:

	/*** オペレータ ***/
	void operator()(const tbb::blocked_range<int>& range)const
	{
		for(int n = range.begin(); n != range.end();++n)
		{
				TbbVec.push_back(n);
		}
	}

};


/**************** ここからメイン関数 ********************/
const int NUM = 500; //要素数

int main()
{

	tbb::task_scheduler_init TbbInit;

	parallel_for(tbb::blocked_range<int>(0,NUM,50),PrimePush()); //grainsize 50

	TbbInit.terminate();

	std::copy(TbbVec.begin(),TbbVec.end(),std::ostream_iterator<int>(std::cout,"\n"));

	return EXIT_SUCCESS;
}

メモ


0〜500までの要素をgrainsize 50で並列化した。

(※grainsizeが500より大きいならたぶんstd::vectorでもエラーにならないはず。CPU1つで処理すると思う)


なお、結果の出力は
	tbb::concurrent_vector<int>::iterator start;
	tbb::concurrent_vector<int>::iterator end = TbbVec.end();
	for(start = TbbVec.begin();start != end;++start)
	{
		std::cout << *start << "\n";
	}
のようにしてもOK。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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