多线程求pi实验报告
多核求PI实验报告
Monte Carlo方法计算Pi
一、实验要求
以OpenMP实现Monte Carlo计算Pi的并行程序注意:
制导循环编译? 共享变量的处理? 编译运行
比较
修改测试点数,提高计算精度。? 利用OpenMP实现积分法,比较。
二、实验原理
通过蒙特卡罗算法计算圆周率的主导思想是:统计学(概率) 1.一个正方形有一个内切圆,向这个正方形内随机的画点,则点落
在圆内的概论为P=圆面积/正方形面积。
2. 在一个平面直角坐标系下,在点(1,1)处画一个半径为R=1的
圆,以这个圆画一个外接正方形,其边长为R=1(R=1时,圆面积即Pi)。
3. 随机取一点(X,Y)使得0=X=2R并且0=Y=2R,即随机
点在正方形内。
4. 判断点是否在圆内,通过公式(X-R)(X-R)+(Y-R)(Y-R)R*R计算。
5. 设所有点的个数为N,落在圆内的点的个数为M,则
P=M/N=4*R*R/Pi*R*R=4/Pi ? Pi=4*N/M
当实验次数越多(N越大),所计算出的Pi也越准确。? 但计算机上的随机数毕竟是伪随机数,当取值超过一
定值,也会出现不随机现象,因为伪随机数是周期函数。如果想提高精度,最好能用真正的随机数生成器(需要更深的知识)。
三、实验步骤
1. 利用蒙特卡洛方法实现求PI值(利用OpenMP)思路:根据所给的串行程序,只需根据OpenMp的用法将其转换。源码: #include stdafx.h #includestdio.h
#includetime.h #include omp.h #include iostream using namespace std;
int _tmain(int argc, _TCHAR* argv[]) {
long max=1000000; long i,count=0;
double x,y,bulk,starttime,endtime; time_t t;
cout请输入测试点的个数:endl; cinmax;
starttime=clock();
// 产生以当前时间开始的随机种子srand((unsigned) time(&t)); #pragma omp parallel for num_threads(8) default(shared) private(x,y) reduction(+:count) for(i=0;imax;i++) {
x=rand();x=x/32767;y=rand(); y=y/32767;
if((x*x+y*y)=1) count++; }
bulk=4*(double(count)/max); endtime= clock();
printf(所得PI的值如下:%f \n, bulk);
printf(计算PI的过程共用时间: %f 秒\n,(endtime-starttime)/ CLOCKS_PER_SEC); return 0; }
2. 利用积分法实现求PI(利用OpenMP)思路:与上同样道理。源码:
#include stdafx.h #includestdio.h #includestdlib.h #includetime.h #include iostream using namespace std;
static long num_steps=10; double step,pi;
int _tmain(int argc, _TCHAR* argv[]) {
int i;
double x,sum=0.0;
clock_t start,finish;
printf(请输入您要用几步来进行计算\n); cinnum_steps;
step=1.0/(double)num_steps; start=clock();
#pragma omp parallel for num_threads(8) default(shared) private(x) reduction(+:sum)
for(i=0;inum_steps;i++) {
x=(i+0.5)*step;
sum=sum+4.0/(1.0+x*x); }
pi=step*sum;
printf(所得PI的值如下:\nPI=%f\n,pi); finish=clock();
printf(计算PI的过程共用时间:%f 秒\n,(double)(finish - start) / CLOCKS_PER_SEC); return 0; }
四、实验结果的分析 1. 对于蒙特卡洛方法的分析
修改测试点数,提高计算精度当测试点的个数为100时:
当测试点的个数为10000000时:
当测试点个数为:100000000时
2. 对于积分方法的分析
积分方法与蒙特卡洛方法的比较
2.1
程序中同样开了8个线程,当循环的总次数相等时,都为10000 时。二者的比较如下:积分法的结果:
蒙特卡洛的结果:
2.2当循环次数均为100000时:
积分法的结果:
蒙特卡洛的结果:
由以上的结果可知二者的所用时间都为0.004秒时,但是二者的精度却相差很大。利用积分法求出的PI更加的精确。相比来说积分法的精度相对来说更高些。
五、实验心得
通过这次的实验,我知道了可以通过另外的方法来实现多线程程序。并且利用OpenMp的方法实现多线程的程序更加的简单,
利用一般的方法实现多线程比较麻烦。利用蒙特卡洛的来计算PI 的值时有一定的局限性,这是由程序的实现方法决定的。计算机上的随机数毕竟是伪随机数,当取值超过一定值,也会出现不随机现象,因为伪随机数是周期函数。如果想提高精度,最好能用真正的随机数生成器(需要更深的知识)。
篇二:pi的计算实验报告
1
2
printf怎么加endl3
3、
4
4、
5、
5
篇三:求PI_实验报告
PI值的计算
一、程序清单(各方法之间的不同之处用红标注)
1、利用不同的空间(全局变量)来实现对共享资源的访问#include iostream.h
#include windows.h
#include iomanip.h
#include time.h
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论