欢迎来到天天文库
浏览记录
ID:14288918
大小:68.50 KB
页数:5页
时间:2018-07-27
《计算pi_计101冯康28》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、计算机学院计科101冯康201000814128Pi值计算计算圆周率采用的是割圆术,即把圆分割成若干个小矩形,通过求矩形的面积总和来近似圆的面积。这里采用计算半径为1的四分之一圆的扇形的面积,得出的值即为所求的圆周率。计算公式为:使用该方法计算出来的圆周率,其精确度取决于[0,1]区间内划分的子区间数。该数值越大,圆周率的精度值越大,即其小数点后的位数越多。使用单线程实现该算法的过程十分简单,但只适用于计算低精度值的圆周率。计算十位小数点后超过十位的圆周率在单线程下需要几分钟甚至几个小时的的运行时间,因此应用多线程来实
2、现该算法具有十分重要的意义。对于计算公式的得出过程不是本次试验的重点,这里不解释。其串行计算方法如下图所示:利用所学到的Windows多线程编程方法改进该串行计算方法,实现算法并行化处理。提示:1、循环体能否分割?2、哪些变量可以本地化或全局化3、哪些变量需要所有的线程所共享实验过程:5计算机学院计科101冯康201000814128串行程序核心代码如下:step=1.0/(double)num_steps;for(inti=0;i3、1.0+x*x);}分析:这个for循环每执行一次便计算出一个小矩形的面积,将其结果加到总面积sum上去,而各个矩形的计算是相互独立的,也就是说可以将每个矩形的计算过程作为一个任务,分配给特定的线程。每个小矩形的面积采用局部变量来保存,矩形总面积(PI)sum采用全局变量来保存。由于多线程程序是并发执行的,那么各个线程都可以访问sum(PI)。如果不对sum采用一定的保护措施,那么同一时间可能有多个线程对sum进行访问操作,势必会发生数据竞争,为了避免这种情况的产生,可以采用以下几种方法:Ø事件(Event)Ø临界区(4、Criticalsection)Ø互斥量(Mutex)Ø信号量(Semaphore这里采用临界区来保证某一时刻只用一个线程访问sum(PI):EnterCriticalSection(&gCS);PI+=partialSum*gStep;LeaveCriticalSection(&gCS);并行程序核心代码如下:DWORDWINAPIthreadFunction(LPVOIDpArg){intmyNum=*((int*)pArg);doublepartialSum=0.0,x;for(inti=myNum;i5、Steps;i+=gNumThreads){x=(i+0.5f)/gNumSteps;partialSum+=4.0f/(1.0f+x*x);}EnterCriticalSection(&gCS);PI+=partialSum*gStep;LeaveCriticalSection(&gCS);return0;}分析:将0->NumThreads-1的进程分别交给编号为0,1,2,3………NumThreads-2,NumThreads-1的NumThreads个线程来执行,依次类推,一轮一轮进行执行,最后也可以将gNum6、Steps个任务均分给NumThreads个线程来执行。数据测试:1)计算量相同,线程数不同(gNumSteps=100000000)线程数运行时间(S)11.77221.0925计算机学院计科101冯康20100081412830.91040.88950.92460.89470.90080.90790.911100.900110.915分析:由表中的数据可看出,多线程比单线程的性能提高很多。此后随着线程数的增多性能变化并不明显,线程数为4的时候计算所需时间最少,但超过4个线程性能开始下降。(2)计算量不同,线程数相同7、(比较单线程和四线程)单位(S)N四线程单线程100000.0000.0001000000.0030.00210000000.0100.008100000000.0960.0901000000000.8100.88910000000008.8138.8211000000000011.91712.484分析:由表中的数据可看出,当N值小于100000000时,多线程的性能并不比单线程好,甚至比单线程更差。随着N值的增大,多线程的优势开始显现,N值越大,多线程对比单线程的优势越明显。结论:当系统的计算量较大时,多线程较之单8、线程在性能上会有很大的提高,但是在计算量较小时多线程的优势并不明显,甚至有时会比单线程运行得更慢。理论上讲,线程越多,程序的并行化程度越高,其运行速度应该越快。但是实际上,由于多线程之间的通信、线程的切换会占用系统资源,线程过多反而会降低程序的运行速度,结果适得其反。附录代码:并行程序:#include#incl
3、1.0+x*x);}分析:这个for循环每执行一次便计算出一个小矩形的面积,将其结果加到总面积sum上去,而各个矩形的计算是相互独立的,也就是说可以将每个矩形的计算过程作为一个任务,分配给特定的线程。每个小矩形的面积采用局部变量来保存,矩形总面积(PI)sum采用全局变量来保存。由于多线程程序是并发执行的,那么各个线程都可以访问sum(PI)。如果不对sum采用一定的保护措施,那么同一时间可能有多个线程对sum进行访问操作,势必会发生数据竞争,为了避免这种情况的产生,可以采用以下几种方法:Ø事件(Event)Ø临界区(
4、Criticalsection)Ø互斥量(Mutex)Ø信号量(Semaphore这里采用临界区来保证某一时刻只用一个线程访问sum(PI):EnterCriticalSection(&gCS);PI+=partialSum*gStep;LeaveCriticalSection(&gCS);并行程序核心代码如下:DWORDWINAPIthreadFunction(LPVOIDpArg){intmyNum=*((int*)pArg);doublepartialSum=0.0,x;for(inti=myNum;i5、Steps;i+=gNumThreads){x=(i+0.5f)/gNumSteps;partialSum+=4.0f/(1.0f+x*x);}EnterCriticalSection(&gCS);PI+=partialSum*gStep;LeaveCriticalSection(&gCS);return0;}分析:将0->NumThreads-1的进程分别交给编号为0,1,2,3………NumThreads-2,NumThreads-1的NumThreads个线程来执行,依次类推,一轮一轮进行执行,最后也可以将gNum6、Steps个任务均分给NumThreads个线程来执行。数据测试:1)计算量相同,线程数不同(gNumSteps=100000000)线程数运行时间(S)11.77221.0925计算机学院计科101冯康20100081412830.91040.88950.92460.89470.90080.90790.911100.900110.915分析:由表中的数据可看出,多线程比单线程的性能提高很多。此后随着线程数的增多性能变化并不明显,线程数为4的时候计算所需时间最少,但超过4个线程性能开始下降。(2)计算量不同,线程数相同7、(比较单线程和四线程)单位(S)N四线程单线程100000.0000.0001000000.0030.00210000000.0100.008100000000.0960.0901000000000.8100.88910000000008.8138.8211000000000011.91712.484分析:由表中的数据可看出,当N值小于100000000时,多线程的性能并不比单线程好,甚至比单线程更差。随着N值的增大,多线程的优势开始显现,N值越大,多线程对比单线程的优势越明显。结论:当系统的计算量较大时,多线程较之单8、线程在性能上会有很大的提高,但是在计算量较小时多线程的优势并不明显,甚至有时会比单线程运行得更慢。理论上讲,线程越多,程序的并行化程度越高,其运行速度应该越快。但是实际上,由于多线程之间的通信、线程的切换会占用系统资源,线程过多反而会降低程序的运行速度,结果适得其反。附录代码:并行程序:#include#incl
5、Steps;i+=gNumThreads){x=(i+0.5f)/gNumSteps;partialSum+=4.0f/(1.0f+x*x);}EnterCriticalSection(&gCS);PI+=partialSum*gStep;LeaveCriticalSection(&gCS);return0;}分析:将0->NumThreads-1的进程分别交给编号为0,1,2,3………NumThreads-2,NumThreads-1的NumThreads个线程来执行,依次类推,一轮一轮进行执行,最后也可以将gNum
6、Steps个任务均分给NumThreads个线程来执行。数据测试:1)计算量相同,线程数不同(gNumSteps=100000000)线程数运行时间(S)11.77221.0925计算机学院计科101冯康20100081412830.91040.88950.92460.89470.90080.90790.911100.900110.915分析:由表中的数据可看出,多线程比单线程的性能提高很多。此后随着线程数的增多性能变化并不明显,线程数为4的时候计算所需时间最少,但超过4个线程性能开始下降。(2)计算量不同,线程数相同
7、(比较单线程和四线程)单位(S)N四线程单线程100000.0000.0001000000.0030.00210000000.0100.008100000000.0960.0901000000000.8100.88910000000008.8138.8211000000000011.91712.484分析:由表中的数据可看出,当N值小于100000000时,多线程的性能并不比单线程好,甚至比单线程更差。随着N值的增大,多线程的优势开始显现,N值越大,多线程对比单线程的优势越明显。结论:当系统的计算量较大时,多线程较之单
8、线程在性能上会有很大的提高,但是在计算量较小时多线程的优势并不明显,甚至有时会比单线程运行得更慢。理论上讲,线程越多,程序的并行化程度越高,其运行速度应该越快。但是实际上,由于多线程之间的通信、线程的切换会占用系统资源,线程过多反而会降低程序的运行速度,结果适得其反。附录代码:并行程序:#include#incl
此文档下载收益归作者所有