parallel_for문과는 달리 합산 및 정산을 할때 동기화 이슈가 없다.
각각 쓰레드 별로 body 객체가 생성이 되고 연산후
join문에서 합산되기때문이다.
[-] Collapse
#include <stdio.h>
#include <tchar.h>
#include <tbb/tbb.h>
#ifdef _DEBUG
#pragma comment(lib, "tbb_debug.lib")
#else
#pragma comment(lib, "tbb.lib")
#endif // _DEBUG
using namespace tbb;
class CSumBody
{
public:
CSumBody()
{
sum_ = 0 ;
}
CSumBody(CSumBody &body, split)
{
sum_ = 0 ;
}
void operator()(const tbb::blocked_range<__int64> &iter)
{
for (__int64 n = iter.begin() ; n != iter.end() ; ++n)
{
sum_ += 1 ;
}
}
void join(const CSumBody &body)
{
sum_ += body.sum_ ;
}
public:
__int64 sum_ ;
};
int _tmain(int argc, _TCHAR* argv[])
{
tick_count start,stop;
__int64 sum = 0 ;
task_scheduler_init init ;
start = tick_count::now();
CSumBody body ;
parallel_reduce(blocked_range<__int64>(0, 1000000000), body, auto_partitioner()) ;
stop = tick_count::now();
printf("Result %d \t시간 %f\n", body.sum_, (stop - start).seconds()) ;
getchar() ;
return 0;
}
#include <tchar.h>
#include <tbb/tbb.h>
#ifdef _DEBUG
#pragma comment(lib, "tbb_debug.lib")
#else
#pragma comment(lib, "tbb.lib")
#endif // _DEBUG
using namespace tbb;
class CSumBody
{
public:
CSumBody()
{
sum_ = 0 ;
}
CSumBody(CSumBody &body, split)
{
sum_ = 0 ;
}
void operator()(const tbb::blocked_range<__int64> &iter)
{
for (__int64 n = iter.begin() ; n != iter.end() ; ++n)
{
sum_ += 1 ;
}
}
void join(const CSumBody &body)
{
sum_ += body.sum_ ;
}
public:
__int64 sum_ ;
};
int _tmain(int argc, _TCHAR* argv[])
{
tick_count start,stop;
__int64 sum = 0 ;
task_scheduler_init init ;
start = tick_count::now();
CSumBody body ;
parallel_reduce(blocked_range<__int64>(0, 1000000000), body, auto_partitioner()) ;
stop = tick_count::now();
printf("Result %d \t시간 %f\n", body.sum_, (stop - start).seconds()) ;
getchar() ;
return 0;
}
'C++ > Intell C++' 카테고리의 다른 글
간단한 TBB parallel_for 예제 (0) | 2014.09.16 |
---|---|
간단한 TBB parallel_while 예제 (0) | 2014.09.16 |
간단한 TBB parallel_sort 예제 (0) | 2014.09.16 |
간단한 TBB parallel_invoke 예제 (1) | 2014.09.16 |