并行计算2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并行计算
实
验
报
告
学院名称计算机科学与技术学院专业计算机科学与技术
学生姓名
学号
年班级
2016年5 月20 日
一、实验内容
本次试验的主要内容为采用多线程的方法计算行列式的值,对实验结果进行统计并分析以及加速比曲线分析,从而对并行计算有进一步的了解。
二、实验原理
给定行列式:
求解行列式值的展开法求解方法如下:
余子式:在阶行列式中,把元素所在的第行和第列划去后,留下来的阶行列式叫做元素的余子式,记作M
ij
。
代数余子式:A ij= (-1)i+j M
ij
行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即D =
a i1A
i1
+a
in
A
in
。
一个n阶行列式,如果其中第i行所有元素除外都为零,那末这行列式等于与
它的代数余子式的乘积,即D = a
ij A ij。
多线程的计算方法主要通过将计算过程分到几个线程中去,每个线程计算自己的部分,对于行列式而言,也就是每个线程计算部分余子式的值,最后相加。由于一个行列式的值等于某一行或一列的值与其对应代数余子式的和,因此整个过程是具有递归性质的,程序也可以递归的计算。
三、程序流程图
程序主体部分流程图如下:
图3 程序整体流程图
四、实验结果及分析
令线程数分别为1、2、5、10、20、30,并且对于每次实验重复十次求平均值。随线程数变化的时间结果如下:
图4 随线程数变化的时间
实验加速比曲线的计算公式类似于
结果如下:
图5 加速比曲线
实验结果与预期类似,当线程总数较少时,线程数的增多会对程序计算速度带来明显的提升,当线程总数增大到足够大时,由于物理节点的核心数是有限的,因此会给cpu带来较多的调度,线程的切换和最后结果的汇总带来的时间开销较大,所以线程数较大时,增加线程数不会带来明显的速度提升,甚至可能下降。
本次实验过程中,ppn=8,节点数n=2,也即共16个核心,因此推测当线程数接近16附近
时,会出现线程竞争的情况,因此程序总体效率没有明显提升。
五、实验总结
本次试验的主要内容是多线程计算行列式的实现,通过这次实验,我对并行计算有了进一步的理解。相对于第一个实验的计算pi而言,计算行列式的程序显得比较复杂。首先是因为程序本身的复杂特性,其次是自己线性代数基础较差,因此程序编写遇到了较多困难。
在具体编写的过程中,自己最初的想法是对于矩阵D n x n而言,创建n个线程每个线程计算对应的余子式,这样程序实现比较简单明了。但是计算行列式值随着行列式规模n的增加不是线性增加的,而是快于指数级的,而线程数目是线性增长的,于是难以对程序的性能做分析,很难在任务负载和线程数间得到明确的关系,最终采用线程数可以自由选择方案。
在程序实现方面,要使每次计算都有相同的计算量,所以事先生成11x11的矩阵存储到文本文件中。自己对c++的文件操作和指针基础不够扎实,因此遇到了一些问题。
经过本次试验,自己对pthread有了进一步的理解,也对同步和加锁有了一些认识,认识到自己的c++基础还不够好,因此要进一步加强自己的技能。
六、程序代码及部署
程序源代码见cpp文件
部署说明:
使用gcc编译即可,编译时加上-pthread参数,运行时任务提交到服务器上。
编译命令如下:
gcc -pthread det_3013216011.cpp -o det
pbs脚本(rundet.pbs)如下:
#!/bin/bash
#PBS -N det
#PBS -l nodes=2:ppn=8
#PBS -q AM016_queue
#PBS -j oe
cd $PBS_O_WORKDIR
for ((i=1;i<=10;i++))
do
./det matrixData.txt 1 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 2 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 3 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 4 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 5 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 10 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 15 >> rundet.log done
for ((i=1;i<=10;i++))
do
./det matrixData.txt 20 >> rundet.log done
for ((i=1;i<=10;i++))
do