欢迎来到天天文库
浏览记录
ID:14103608
大小:747.50 KB
页数:22页
时间:2018-07-26
《矩阵乘法的并行化 实验报告.》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、北京科技大学计算机与通信工程学院实验报告实验名称:学生姓名:专业:班级:学号:指导教师:实验成绩:________________________________实验地点:实验时间:2015年05月一、实验目的与实验要求1、实验目的1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论;2、实验要求1编写矩阵乘法的串行程序,多次运行得到结果汇总;2编写基于MPI,分别实现矩阵乘法的并行化。对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。二、实验设备(环境)及要求《VS2013
2、》C++语言MPICH2三、实验内容与步骤实验1,矩阵乘法的串行实验(1)实验内容编写串行程序,运行汇总结果。(2)主要步骤按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。实验2矩阵乘法的并行化实验3个总进程5个总进程7个总进程9个进程16个进程四:实验结果与分析(一)矩阵乘法并行化矩阵并行化算法分析:并行策略:1间隔行带划分法算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中对于矩阵A*B如图:进程1:矩阵A第一行进程
3、2:矩阵A第二行进程3:矩阵A第三行进程1:矩阵A第四行时间复杂度分析:f(n)=6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2(k为从进程分到的行数)因此O(n)=(n);空间复杂度分析:从进程的存储空间不共用,f(n)=n;因此O(n)=(n);2间隔行带划分法算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中对于矩阵A*B如图:进程1:矩阵A第一行进程2:矩阵A第二行进程3:矩阵A第三行进程3:矩阵A第四行时间复杂度分析:f(n)=6+2+8
4、+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2(k为从进程分到的行数)因此O(n)=(n);空间复杂度分析:从进程的存储空间不共用,f(n)=n;因此T(n)=O(n);测试环境简介:《VS2013》Win7旗舰版正确性测试结果:并行结果:串行结果:通过比较发现两者相同,因此可以确定运算结果正确。性能测试结果:串行125ms107ms108ms98ms109ms110ms3进程0.009647ms0.009936ms0.010825ms0.009207ms0.008811ms0.009831ms5进程0.007795ms0.00
5、7648ms0.008588ms0.008334ms0.007686ms0.007731ms7进程0.010729ms0.011336ms0.011606ms0.011403ms0.011621ms0.014563ms9进程0.016547ms0.014439ms0.016300ms0.015455ms0.015187ms0.011240ms16进程0.024964ms0.027917ms0.024721ms0.028152ms0.022296ms0.021321ms通过对比分析得出,并行算法能够有效提高矩阵乘法的运算效率;(二)串行算法分析时
6、间复杂度:f(n)=2+n^2+2*n+3*n+7+n+n+7;因此T(n)=O(n^2)空间复杂度:T(n)=O(1)五:结论(讨论)1、实验结论(1)根据前面实验结果,可以证明并行算法比串行算法更能有效地运算矩阵乘法,可以提高效率数十倍(2)如下图,根据结果可以得出并行程序并不是进程数越多,程序运行时间越短,程序运行还受计算机运算器数的限制2、讨论1由于矩阵乘法的运算并不是很复杂,因此运算时间很短,达到了毫秒级,因此准确度有一定的影响;2因为时间紧迫,未能进一步分析代码,同时只用了一种并行算法。六:代码附录串行算法:#include7、io.h>#include#include#include#defineN30#defineM30voidjuzhen_mul(intm,intn,int*p1[M],intm1,intn1,int*p2[M]){inti,j,x=0;intc[N][M]={0};2for(i=0;i8、+;if(x==n1){x=0;i++;printf("");2*303*m}}}voidmain(){doublestart,finish;st
7、io.h>#include#include#include#defineN30#defineM30voidjuzhen_mul(intm,intn,int*p1[M],intm1,intn1,int*p2[M]){inti,j,x=0;intc[N][M]={0};2for(i=0;i8、+;if(x==n1){x=0;i++;printf("");2*303*m}}}voidmain(){doublestart,finish;st
8、+;if(x==n1){x=0;i++;printf("");2*303*m}}}voidmain(){doublestart,finish;st
此文档下载收益归作者所有