当前位置:文档之家› 并行计算2

并行计算2

并 行 计 算



学院名称 计算机科学与技术学院
专 业 计算机科学与技术
学生姓名
学 号
年 班 级

2016年 5 月 20 日
一、 实验内容
本次试验的主要内容为采用多线程的方法计算行列式的值,对实验结果进行统
计并分析以及加速比曲线分析,从而对并行计算有进一步的了解。

二、 实验原理
给定行列式:

求解行列式值的展开法求解方法如下:
余子式:在阶行列式中,把元素所在的第行和第列划去后,留下来的阶行列式
叫做元素的余子式,记作Mij。
代数余子式:Aij= (-1)i+jM
ij

行列式等于它的任一行(列)的各元素与其对应的代数余子式乘积之和,即D =

ai1Ai1+ainAin。
一个n阶行列式,如果其中第i行所有元素除外都为零,那末这行列式等于 与
它的代数余子式的乘积,即D = aijAij。
多线程的计算方法主要通过将计算过程分到几个线程中去,每个线程计算自己
的部分,对于行列式而言,也就是每个线程计算部分余子式的值,最后相加。由于
一个行列式的值等于某一行或一列的值与其对应代数余子式的和,因此整个过程是
具有递归性质的,程序也可以递归的计算。

三、 程序流程图
程序主体部分流程图如下:
图3 程序整体流程图
四、 实验结果及分析
令线程数分别为1、2、5、10、20、30,并且对于每次实验重复十次求平均值。
随线程数变化的时间结果如下:
图4 随线程数变化的时间
实验加速比曲线的计算公式类似于

结果如下:

图5 加速比曲线
实验结果与预期类似,当线程总数较少时,线程数的增多会对程序计算速度带来明显的提
升,当线程总数增大到足够大时,由于物理节点的核心数是有限的,因此会给cpu带来较多的
调度,线程的切换和最后结果的汇总带来的时间开销较大,所以线程数较大时,增加线程数不
会带来明显的速度提升,甚至可能下降。
本次实验过程中,ppn=8,节点数n=2,也即共16个核心,因此推测当线程数接近16附近
时,会出现线程竞争的情况,因此程序总体效率没有明显提升。
五、实验总结

本次试验的主要内容是多线程计算行列式的实现,通过这次实验,我对并行计
算有了进一步的理解。相对于第一个实验的计算pi而言,计算行列式的程序显得比
较复杂。首先是因为程序本身的复杂特性,其次是自己线性代数基础较差,因此程
序编写遇到了较多困难。

在具体编写的过程中,自己最初的想法是对于矩阵Dnxn而言,创建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
./det matrixData.txt 30 >> rundet.log
done

提交命令:
qsub runPI.pbs
之后查看runPI.log结果即可。

相关主题