计算PI_计101冯康28.doc

上传人:re****.1 文档编号:549170371 上传时间:2023-07-17 格式:DOC 页数:5 大小:68.50KB
返回 下载 相关 举报
计算PI_计101冯康28.doc_第1页
第1页 / 共5页
计算PI_计101冯康28.doc_第2页
第2页 / 共5页
计算PI_计101冯康28.doc_第3页
第3页 / 共5页
计算PI_计101冯康28.doc_第4页
第4页 / 共5页
计算PI_计101冯康28.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《计算PI_计101冯康28.doc》由会员分享,可在线阅读,更多相关《计算PI_计101冯康28.doc(5页珍藏版)》请在金锄头文库上搜索。

1、计算机学院 计科101 冯康 201000814128Pi值计算计算圆周率采用的是割圆术,即把圆分割成若干个小矩形,通过求矩形的面积总和来近似圆的面积。这里采用计算半径为1的四分之一圆的扇形的面积,得出的值即为所求的圆周率。计算公式为:使用该方法计算出来的圆周率,其精确度取决于0,1区间内划分的子区间数。该数值越大,圆周率的精度值越大,即其小数点后的位数越多。使用单线程实现该算法的过程十分简单,但只适用于计算低精度值的圆周率。计算十位小数点后超过十位的圆周率在单线程下需要几分钟甚至几个小时的的运行时间,因此应用多线程来实现该算法具有十分重要的意义。对于计算公式的得出过程不是本次试验的重点,这里

2、不解释。其串行计算方法如下图所示:利用所学到的Windows多线程编程方法改进该串行计算方法,实现算法并行化处理。提示:1、循环体能否分割?2、哪些变量可以本地化或全局化3、哪些变量需要所有的线程所共享实验过程:串行程序核心代码如下:step=1.0/(double)num_steps;for (int i=0;inum_steps;+i)x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);分析:这个for循环每执行一次便计算出一个小矩形的面积,将其结果加到总面积sum上去,而各个矩形的计算是相互独立的,也就是说可以将每个矩形的计算过程作为一个任务,分配给特定的线程。每个

3、小矩形的面积采用局部变量来保存,矩形总面积(PI)sum采用全局变量来保存。由于多线程程序是并发执行的,那么各个线程都可以访问sum(PI)。如果不对sum采用一定的保护措施,那么同一时间可能有多个线程对sum进行访问操作,势必会发生数据竞争,为了避免这种情况的产生,可以采用以下几种方法: 事件(Event) 临界区(Critical section) 互斥量(Mutex) 信号量(Semaphore这里采用临界区来保证某一时刻只用一个线程访问sum(PI): EnterCriticalSection(&gCS);PI += partialSum * gStep;LeaveCriticalSe

4、ction(&gCS);并行程序核心代码如下:DWORD WINAPI threadFunction(LPVOID pArg)int myNum = *(int *)pArg);double partialSum = 0.0, x; for ( int i=myNum; iNumThreads-1的进程分别交给编号为0,1,2,3NumThreads-2, NumThreads-1的NumThreads个线程来执行,依次类推,一轮一轮进行执行,最后也可以将gNumSteps个任务均分给NumThreads个线程来执行。数据测试: 1)计算量相同,线程数不同(gNumSteps=10000000

5、0)线程数运行时间(S)11.77221.09230.91040.88950.92460.89470.90080.90790.911100.900110.915分析:由表中的数据可看出,多线程比单线程的性能提高很多。此后随着线程数的增多性能变化并不明显,线程数为4的时候计算所需时间最少,但超过4个线程性能开始下降。(2)计算量不同,线程数相同(比较单线程和四线程)单位(S)N四线程单线程100000.0000.0001000000.0030.00210000000.0100.008100000000.0960.0901000000000.8100.88910000000008.8138.821

6、1000000000011.91712.484分析:由表中的数据可看出,当N值小于100000000时,多线程的性能并不比单线程好,甚至比单线程更差。随着N值的增大,多线程的优势开始显现,N值越大,多线程对比单线程的优势越明显。结论:当系统的计算量较大时,多线程较之单线程在性能上会有很大的提高,但是在计算量较小时多线程的优势并不明显,甚至有时会比单线程运行得更慢 。理论上讲,线程越多,程序的并行化程度越高,其运行速度应该越快。但是实际上,由于多线程之间的通信、线程的切换会占用系统资源,线程过多反而会降低程序的运行速度,结果适得其反。 附录代码:并行程序:#include #include #i

7、nclude const long gNumSteps =1000000000;const int gNumThreads = 4;double gStep = 0.0;double PI = 0.0;CRITICAL_SECTION gCS;DWORD WINAPI threadFunction(LPVOID pArg)int myNum = *(int *)pArg);double partialSum = 0.0, x; for ( int i=myNum; igNumSteps; i+=gNumThreads )x = (i + 0.5f) / gNumSteps;partialSum

8、 += 4.0f / (1.0f + x*x); EnterCriticalSection(&gCS);PI += partialSum * gStep;LeaveCriticalSection(&gCS);return 0;void main()HANDLE threadHandlesgNumThreads;int tNumgNumThreads;clock_t start, stop;start = clock();InitializeCriticalSection(&gCS);gStep = 1.0 / gNumSteps;for ( int i=0; igNumThreads; +i

9、)tNumi = i;threadHandlesi = CreateThread( NULL,0,threadFunction,(LPVOID)&tNumi,0,NULL); WaitForMultipleObjects(gNumThreads, threadHandles, TRUE, INFINITE);DeleteCriticalSection(&gCS);stop = clock();printf(PI=%.20fn, PI );printf(Time=%.3fn,(double)(stop - start)/1000.0);*串行程序:#include #include #inclu

10、de #include /获取系统时间static long num_steps=10000000000;double step,PI;int main()struct timeb t1,t2;double Time=0.0;srand(unsigned int)(time(NULL);/设定时间种子ftime(&t1);double x,sum=0.0;step=1.0/(double)num_steps;for (int i=0;inum_steps;+i)x=(i+0.5)*step;sum=sum+4.0/(1.0+x*x);PI=step*sum;ftime(&t2);Time=(t2.time-t1.time)+(t2.millitm-t1.millitm)/1000.0;printf(Time=%.3fn,Time);printf(PI=%.20fn,PI);5

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号