// Pi.cpp : 定义控制台应用程序的入口点。
//求圆周率PI#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <omp.h>
#include <iostream>
using namespace std;static long num_steps=1000000000;//定义所分的块数
#define NUM_THREADS 2 //定义所开启的线程数
int _tmain(int argc, _TCHAR* argv[])
{
int i;
omp_set_num_threads(NUM_THREADS);//开启线程
double x,sum=0.0,pi;
clock_t start_time,end_time;
double step=1.0/(double)num_steps;//并行--------------------------------------
start_time=clock();
#pragma omp parallel sections reduction(+:sum) private(x,i)
{
#pragma omp section
{
for (i=omp_get_thread_num();i<num_steps;i=i+NUM_THREADS)
{
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x);}
}
#pragma omp section
{
for (i=omp_get_thread_num();i<num_steps;i=i+NUM_THREADS)
{
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x);}
}}
pi=step*sum;
end_time=clock();cout<<"Pi="<<pi<<endl;
cout<<"并行time="<<end_time-start_time<<endl;//串行-----------------------------------
sum=0.0;
start_time=clock();
for (i=0;i<num_steps;i++)
{
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x);
}
pi=step*sum;
end_time=clock();cout<<"Pi="<<pi<<endl;
cout<<"串行time="<<end_time-start_time<<endl;system("pause");
return 0;
}
//运行结果如下:(相对加速比:7675/4496=1.71)