欢迎来到天天文库
浏览记录
ID:22790938
大小:78.50 KB
页数:6页
时间:2018-10-31
《实验一多线程计算pi值》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、实验一、多线程计算PI值1.实验要求•将串行的积分法计算PI值程序改进成多线程层序•解决同步问题2.实验环境VisualC++6.03.计算方法矩形法则的数值积分方法估算pi的值1.串行的积分法计算PI值通过for循环,一个个的把sum值相加。实现代码如下:林includettincludeconstlongnum=10000000;doublestep,PI;clocktstartTineLStopTine;//开始、结束时间uoidnain()//串行程浮没计2、ck();step=1.0/(double)nun;for(i=0;i3、m值,所以在这里要使用临界区,把sum放到临界区中,这样一次只能有一个线程访问和修改sum的值。实现代码如下:DWORDUINAPIparallel(LPUOIDpArg)4、);//离开临界区}return0;1.运行结果并行程序运行结果:三上多獄多^MultiThreading302DebugMultiThreading302.exe"-PI=3.141593算时间:1743Pressanykeytocontinue串行程序运行结果:••0:伏三上多^多^1711]ltiThreadingDebugMultil[PI=3.141593$十算时间:62Pressanykeytocontinue1.实验结果的分析运行结果显示,串行的计算时间比并行的计算时间短。可能是因为分割的小矩形的数量不够大所导致的。就像人5、们出安全通道一样,如果人数较多的话,那么大家抢着走,显然出去的速度是很慢的,如果大家排队,井然有序的出,那么效率显然会提高很多的。2.附代码并行代码林include林include林include林includestaticlongnun=10000000;〃分割的小长方形数量constintnumThread=4;〃开启的钱程数doublestep,PI;clock_tstartTine,stopTime;〃开雄、结束时间CRITICAL_SECTIONzone;〃临界区声6、明崔doublesun=0.0;DWORDWINAPIparallel(LPUOIDpArg)doublex;inttenp=*(int*)pArg;intstart=(tenp*nun)/4;intend=start+num/4;for(inti=start;i〈end;i++){EnterCriticalSection(fezone);//进入临界区x=(i+0.5)*step;sun=sun+4.0/(1.0+x*x);LeaueCriticalSection(&zone);return0;uoidmain()inti;HANDLEhThread[7、nunThread];step=1.0/(double)num;inttNun[nunThread];InitializeCriticalSection(PxZone);//初始化临界区startTine=clock();//开始时间for(i=0;iWaitForMultipleObjects(nunThread,hThread,TRUE,INFINITE);DeleteC8、riticalSection(&zone);//翻除stopTine=clock
2、ck();step=1.0/(double)nun;for(i=0;i3、m值,所以在这里要使用临界区,把sum放到临界区中,这样一次只能有一个线程访问和修改sum的值。实现代码如下:DWORDUINAPIparallel(LPUOIDpArg)4、);//离开临界区}return0;1.运行结果并行程序运行结果:三上多獄多^MultiThreading302DebugMultiThreading302.exe"-PI=3.141593算时间:1743Pressanykeytocontinue串行程序运行结果:••0:伏三上多^多^1711]ltiThreadingDebugMultil[PI=3.141593$十算时间:62Pressanykeytocontinue1.实验结果的分析运行结果显示,串行的计算时间比并行的计算时间短。可能是因为分割的小矩形的数量不够大所导致的。就像人5、们出安全通道一样,如果人数较多的话,那么大家抢着走,显然出去的速度是很慢的,如果大家排队,井然有序的出,那么效率显然会提高很多的。2.附代码并行代码林include林include林include林includestaticlongnun=10000000;〃分割的小长方形数量constintnumThread=4;〃开启的钱程数doublestep,PI;clock_tstartTine,stopTime;〃开雄、结束时间CRITICAL_SECTIONzone;〃临界区声6、明崔doublesun=0.0;DWORDWINAPIparallel(LPUOIDpArg)doublex;inttenp=*(int*)pArg;intstart=(tenp*nun)/4;intend=start+num/4;for(inti=start;i〈end;i++){EnterCriticalSection(fezone);//进入临界区x=(i+0.5)*step;sun=sun+4.0/(1.0+x*x);LeaueCriticalSection(&zone);return0;uoidmain()inti;HANDLEhThread[7、nunThread];step=1.0/(double)num;inttNun[nunThread];InitializeCriticalSection(PxZone);//初始化临界区startTine=clock();//开始时间for(i=0;iWaitForMultipleObjects(nunThread,hThread,TRUE,INFINITE);DeleteC8、riticalSection(&zone);//翻除stopTine=clock
3、m值,所以在这里要使用临界区,把sum放到临界区中,这样一次只能有一个线程访问和修改sum的值。实现代码如下:DWORDUINAPIparallel(LPUOIDpArg)4、);//离开临界区}return0;1.运行结果并行程序运行结果:三上多獄多^MultiThreading302DebugMultiThreading302.exe"-PI=3.141593算时间:1743Pressanykeytocontinue串行程序运行结果:••0:伏三上多^多^1711]ltiThreadingDebugMultil[PI=3.141593$十算时间:62Pressanykeytocontinue1.实验结果的分析运行结果显示,串行的计算时间比并行的计算时间短。可能是因为分割的小矩形的数量不够大所导致的。就像人5、们出安全通道一样,如果人数较多的话,那么大家抢着走,显然出去的速度是很慢的,如果大家排队,井然有序的出,那么效率显然会提高很多的。2.附代码并行代码林include林include林include林includestaticlongnun=10000000;〃分割的小长方形数量constintnumThread=4;〃开启的钱程数doublestep,PI;clock_tstartTine,stopTime;〃开雄、结束时间CRITICAL_SECTIONzone;〃临界区声6、明崔doublesun=0.0;DWORDWINAPIparallel(LPUOIDpArg)doublex;inttenp=*(int*)pArg;intstart=(tenp*nun)/4;intend=start+num/4;for(inti=start;i〈end;i++){EnterCriticalSection(fezone);//进入临界区x=(i+0.5)*step;sun=sun+4.0/(1.0+x*x);LeaueCriticalSection(&zone);return0;uoidmain()inti;HANDLEhThread[7、nunThread];step=1.0/(double)num;inttNun[nunThread];InitializeCriticalSection(PxZone);//初始化临界区startTine=clock();//开始时间for(i=0;iWaitForMultipleObjects(nunThread,hThread,TRUE,INFINITE);DeleteC8、riticalSection(&zone);//翻除stopTine=clock
4、);//离开临界区}return0;1.运行结果并行程序运行结果:三上多獄多^MultiThreading302DebugMultiThreading302.exe"-PI=3.141593算时间:1743Pressanykeytocontinue串行程序运行结果:••0:伏三上多^多^1711]ltiThreadingDebugMultil[PI=3.141593$十算时间:62Pressanykeytocontinue1.实验结果的分析运行结果显示,串行的计算时间比并行的计算时间短。可能是因为分割的小矩形的数量不够大所导致的。就像人
5、们出安全通道一样,如果人数较多的话,那么大家抢着走,显然出去的速度是很慢的,如果大家排队,井然有序的出,那么效率显然会提高很多的。2.附代码并行代码林include林include林include林includestaticlongnun=10000000;〃分割的小长方形数量constintnumThread=4;〃开启的钱程数doublestep,PI;clock_tstartTine,stopTime;〃开雄、结束时间CRITICAL_SECTIONzone;〃临界区声
6、明崔doublesun=0.0;DWORDWINAPIparallel(LPUOIDpArg)doublex;inttenp=*(int*)pArg;intstart=(tenp*nun)/4;intend=start+num/4;for(inti=start;i〈end;i++){EnterCriticalSection(fezone);//进入临界区x=(i+0.5)*step;sun=sun+4.0/(1.0+x*x);LeaueCriticalSection(&zone);return0;uoidmain()inti;HANDLEhThread[
7、nunThread];step=1.0/(double)num;inttNun[nunThread];InitializeCriticalSection(PxZone);//初始化临界区startTine=clock();//开始时间for(i=0;iWaitForMultipleObjects(nunThread,hThread,TRUE,INFINITE);DeleteC
8、riticalSection(&zone);//翻除stopTine=clock
此文档下载收益归作者所有