并行计算1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并行计算
实
验
报
告
学院名称计算机科学与技术学院专业计算机科学与技术
学生姓名
学号
年班级
2016年5 月20 日
一、实验内容
本次试验的主要内容为采用多线程的方法计算pi的值,熟悉linux下pthread 形式的多线程编程,对实验结果进行统计并分析以及加速比曲线分析,从而对并行计算有初步了解。
二、实验原理
本次实验利用中值积分定理计算pi的值
图1 中值定理计算pi
其中公式可以变换如下:
图2 积分计算pi公式的变形
当N足够大时,可以足够逼近pi,多线程的计算方法主要通过将for循环的计算过程分到几个线程中去,每次计算都要更新sum的值,为避免一个线程更新sum 值后,另一个线程仍读到旧的值,所以每个线程计算自己的部分,最后相加。三、程序流程图
程序主体部分流程图如下:
多线程执行函数流程图如下:
四、实验结果及分析
令线程数分别为1、2、5、10、20、30、40、50和100,并且对于每次实验重复十次求平均值。结果如下:
图5 时间随线程的变化
实验加速比曲线的计算公式类似于
结果如下:
图5 加速比曲线
实验结果与预期类似,当线程总数较少时,线程数的增多会对程序计算速度带来明显的提升,当线程总数增大到足够大时,由于物理节点的核心数是有限的,因此会给cpu带来较多的调度,线程的切换和最后结果的汇总带来的时间开销较大,所以线程数较大时,增加线程数不会带来明显的速度提升,甚至可能下降。
五、实验总结
本次试验的主要内容是多线程计算pi的实现,通过这次实验,我对并行计算有了进一步的理解。上学期的操作系统课程中,已经做过相似的题目,因此程序主体部分相似。不同的地方在于,首先本程序按照老师要求应在命令行提供参数,而非将数值写定在程序里,其次是程序不是在自己的电脑上运行,而是通过ssh和批处理脚本等登录到远程服务器提交任务执行。
在运行方面,因为对批处理任务不够熟悉,出现了提交任务无结果的情况,原因在于windows系统要采用换行的方式来表明结束。在实验过程中也遇到了其他问题,大多还是来自于经验的缺乏。
在分析实验结果方面,因为自己是第一次分析多线程程序的加速比,因此比较生疏,参考网上资料和ppt后分析得出结果。
从自己遇到的问题来看,自己对批处理的理解和认识还比较有限,经过本次实验,我对并行计算的理解有了进一步的提高,也意识到了自己存在的一些问题。
六、程序代码及部署
程序源代码见cpp文件
部署说明:
使用gcc编译即可,编译时加上-pthread参数,运行时任务提交到服务器上。
编译命令如下:
gcc -pthread PI_3013216011.cpp -o pi
pbs脚本(runPI.pbs)如下:
#!/bin/bash
#PBS -N pi
#PBS -l nodes=1:ppn=8
#PBS -q AM016_queue
#PBS -j oe
cd $PBS_O_WORKDIR
for ((i=1;i<=10;i++))
do
./pi num_threads N >> runPI.log
done
提交命令:
qsub runPI.pbs
之后查看runPI.log结果即可。