566
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <time.h>
#include "tbb/parallel_reduce.h"
#include "tbb/task_scheduler_init.h"
#include "tbb/blocked_range.h"
using namespace std;
using namespace tbb;
int Nthreads = 2;
int GrainSize = 50000000;
long long num_steps = 100000000;
class CMyPi
{
double *const my_step;
public:
double sum;
void operator()(const blocked_range<size_t>& r);
CMyPi(CMyPi& x, split);
void join(const CMyPi& y);
CMyPi(double *const step);
};
CMyPi::CMyPi(double *const step):my_step(step)
{
sum = 0.0;
}
CMyPi::CMyPi(CMyPi &x, tbb::split):my_step(x.my_step)
{
sum = 0.0;
}
void CMyPi::join(const CMyPi &y)
{
sum += y.sum;
}
// step = 1.0/(double)num_steps;
// for (i=0; i < num_steps; i++)
// {
// x = (i+0.5)*step;
// sum = sum + 4.0/(1.0 + x*x);
// }
void CMyPi::operator ()(const blocked_range<size_t>& r)
{
double x = 0.0;
for(int i = r.begin();i!=r.end();++i)
{
x = (i+0.5)* (*my_step);
sum+=4.0/(1.0+x*x);
}
}
int main(int argc, char* argv[])
{
clock_t start, stop;
double pi;
double width = 1./(double)num_steps;
CMyPi step((double *const)&width);
task_scheduler_init init(task_scheduler_init::deferred);
start = clock();
init.initialize(Nthreads); //设置TBB线程数
parallel_reduce(blocked_range<size_t>(0,num_steps,GrainSize), step);
// parallel_reduce(blocked_range<size_t>(0,num_steps), step, auto_partitioner());
pi = step.sum*width;
stop = clock();
cout << "The value of PI is " << pi << endl;
cout << "The time to calculate PI was " << (double)(stop-start)/CLOCKS_PER_SEC << " seconds\n";
system("pause");
return 0;
}
//#include <stdio.h>
//static long num_steps=100000;
//double step;
//void main()
//{ int i;
// double x, pi, sum = 0.0;
// step = 1.0/(double)num_steps;
// for (i=0; i < num_steps; i++)
// {
// x = (i+0.5)*step;
// sum = sum + 4.0/(1.0 + x*x);
// }
// pi = step * sum;
// printf(“Pi = %f\n”,pi);
//}