《2022年并行处理实验报告:用MPI实现的矩阵乘法的加速比分析 .pdf》由会员分享,可在线阅读,更多相关《2022年并行处理实验报告:用MPI实现的矩阵乘法的加速比分析 .pdf(13页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、华 中 科 技 大 学课程名称并行处理实验名称 矩阵乘法的实现及加速比分析考生姓名李佩佩考生学号 M201372734 系、年级计算机软件与理论2013级类别硕士研究生考试日期 2014年 1 月 3 日名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 13 页 -一.实验目的1)学会如何使用集群2)掌握怎么用并行或分布式的方式编程3)掌握如何以并行的角度分析一个特定的问题二.实验环境1)硬件环境:4 核 CPU、2GB 内存计算机;2)软件环境:Windows XP、MPICH2、VS2010、Xmanager Enterprise3;3)集群登录方式:通过远程桌面连接211.6
2、9.198.2,用户名:pppusr,密码:AE2Q3P0。三.实验内容1.实验代码编写四个.c 文件,分别为 DenseMulMatrixMPI.c、DenseMulMatrixSerial.c、SparseMulMatrixMPI.c 和 SparseMulMatrixSerial.c,用于比较并行和串行矩阵乘法的加速比,以及稀疏矩阵和稠密矩阵的加速比。这里需要说明一下,一开始的时候我是把串、并行放在一个程序中,那么就只有两个.c 文件 DenseMulMatrix.c和 SparseMulMatrix.c,把串行计算矩阵乘的部分放到了主进程中,即procsID=0的进程,但是结果发现执行
3、完串行后,再执行并行就特别的慢。另外,对于稀疏矩阵的处理方面可能不太好,在生成稀疏矩阵的过程中非0 元素位置的生成做到了随机化,但是在进行稀疏矩阵乘法时没有对矩阵压缩,所以跟稠密矩阵乘法在计算时间上没多大区别。方阵A和B的初始值是利用 rand()和srand()函数随机生成的。根据稀疏矩阵和稠密矩阵的定义,对于稀疏矩阵和稠密矩阵的初始化方法InitMatrix(int*M,int*N,int len)会有所不同。这里需要说明一下,一开始对于矩阵A和B的初始化是两次调用 InitMatrix(int*M,int len),生成A和B矩阵,但是随后我发现,由于两次调用方法 InitMatrix
4、的时间间隔非常短,又由于 srand()函数的特点,导致生成的矩阵A和B完全一样;然后,我就在两次调用之间加入了语句“Sleep(1000);”,加入头文件“#include”,这样生成的 A、B矩阵就不一样了,但很快问题又出现了,在 Xshell中不能识别头文件“#include”。所以,最后决定用下面的方法生成矩阵 A和B,B是A的转置。/稠密矩阵的生成方法void InitMatrix(int*M,int*N,int len)srand(unsigned)time(NULL);for(i=0;i len*len;i+)名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 13 页
5、 -Mi=rand()%2;for(i=0;ilen;i+)for(j=0;jlen;j+)Ni*len+j=Mj*len+i;/稀疏矩阵的生成方法void InitMatrix(int*M,int*N,int len)for(i=0;ilen*len;i+)Mi=0;srand(unsigned)time(NULL);for(m=0;m224;m+)for(n=0;n224;n+)i=rand()%len;j=rand()%len;Mi*len+j=1;for(i=0;ilen;i+)for(j=0;jlen;j+)Ni*len+j=Mj*len+i;输入:并行执行的进程数procsNum,
6、对于串行计算,只需要np=1;输出:程序的执行时间。在 Windows XP 下使用 Microsoft Visual Studio2010 编程,由于稀疏矩阵和稠密矩阵的代码只是初始化部分不同,所以以稠密矩阵乘法为例,列出并行和串行的源代码。并行计算的矩阵乘法源代码:DenseMulMatrixMPI.c#include#include#include#include#define Length 1000 int*A,*B,*C,*buffer,*ans;int temp,i,j,k;int procsID,procsNum,line;名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页
7、,共 13 页 -double startTime,endTime,totalTime;void InitMatrix(int*M,int*N,int len);/实现部分见上面void del()free(A);free(B);free(C);free(buffer);free(ans);int main(int argc,char *argv)MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&procsID);/获取当前进程号 MPI_Comm_size(MPI_COMM_WORLD,&procsNu
8、m);/获取进程数目line=Length/procsNum;/将数据分为(进程数)个块 A=(int*)malloc(sizeof(int)*Length*Length);B=(int*)malloc(sizeof(int)*Length*Length);C=(int*)malloc(sizeof(int)*Length*Length);buffer=(int*)malloc(sizeof(int)*Length*line);ans=(int*)malloc(sizeof(int)*Length*line);if (procsID=0)InitMatrix(A,B,Length);start
9、Time=MPI_Wtime();for (i=1;iprocsNum;i+)MPI_Send(B,Length*Length,MPI_INT,i,0,MPI_COMM_WORLD);for (i=1;iprocsNum;i+)MPI_Send(A+(i-1)*line*Length,Length*line,MPI_INT,i,1,MPI_COMM_WORLD);for (k=1;kprocsNum;k+)MPI_Recv(ans,line*Length,MPI_INT,k,3,MPI_COMM_WORLD,&status);for (i=0;iline;i+)名师资料总结-精品资料欢迎下载-
10、名师精心整理-第 4 页,共 13 页 -for (j=0;jLength;j+)C(k-1)*line+i)*Length+j=ansi*Length+j;for (i=(procsNum-1)*line;iLength;i+)for (j=0;jLength;j+)temp=0;for (k=0;kLength;k+)temp+=Ai*Length+k*Bk*Length+j;Ci*Length+j=temp;endTime=MPI_Wtime();totalTime=endTime-startTime;printf(并行稠密矩阵乘法过程总共花的时间:%.4fsn,totalTime);/
11、ifelse MPI_Recv(B,Length*Length,MPI_INT,0,0,MPI_COMM_WORLD,&status);MPI_Recv(buffer,Length*line,MPI_INT,0,1,MPI_COMM_WORLD,&status);for (i=0;iline;i+)for (j=0;jLength;j+)temp=0;for(k=0;kLength;k+)temp+=bufferi*Length+k*Bk*Length+j;ansi*Length+j=temp;MPI_Send(ans,line*Length,MPI_INT,0,3,MPI_COMM_WORL
12、D);/else MPI_Finalize();del();名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 13 页 -return 0;串行计算的矩阵乘法源代码:DenseMulMatrixSerial.c#include#include#include#define Length 1000 int*A,*B,*C;int i,j,k;clock_t startTime,endTime;double totalTime;void InitMatrix(int*M,int*N,int len);/实现部分见上面void del()free(A);free(B);free(C);i
13、nt main()A=(int*)malloc(sizeof(int)*Length*Length);B=(int*)malloc(sizeof(int)*Length*Length);C=(int*)malloc(sizeof(int)*Length*Length);InitMatrix(A,B,Length);startTime=clock();for(i=0;i Length;i+)for(j=0;j Length;j+)Ci*Length+j=0;for (k=0;k Length;+k)Ci*Length+j+=Ai*Length+k*Bk*Length+j;/forendTime=
14、clock();totalTime=(double)(endTime-startTime)/CLOCKS_PER_SEC;printf(串行稠密矩阵乘法过程总共花的时间:%.4fsn,totalTime);del();名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 13 页 -return 0;2.执行时间截图代码部分完成后,就要传到集群上去运行。以下的截图是我在集群上运行程序的时间。DensMulMatrixSerial.c:图1 稠密矩阵串行乘法DenseMulMatrixMPI.c,np=2:图2 np=2 的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=4
15、:图3 np=4 的稠密矩阵并行乘法名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 13 页 -DenseMulMatrixMPI.c,np=8:图4 np=8 的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=16:图5 np=16 的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=32:图6 np=32 的稠密矩阵并行乘法名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 13 页 -SparseMulMatrixSerial.c 图 7 稀疏矩阵串行乘法SparseMulMatrixMPI.c,np=2:图 8 np=2 的稀疏矩阵并行
16、乘法SparseMulMatrixMPI.c,np=4:图 9 np=4 的稀疏矩阵并行乘法名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 13 页 -SparseMulMatrixMPI.c,np=8:图 10 np=8 的稀疏矩阵并行乘法SparseMulMatrixMPI.c,np=16:图 11 np=16 的稀疏矩阵并行乘法SparseMulMatrixMPI.c,np=32:图 12 np=32 的稀疏矩阵并行乘法名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 13 页 -3.统计数据分析矩阵相乘程序的执行时间、加速比:方阵阶固定为1000,为减少误差
17、,每项实验进行 5 次,取平均值作为实验结果(一切时间数据均以以上截图为准)。所用到的公式:加速比=顺序执行时间/并行执行时间(1)稠密矩阵乘法串行执行平均时间T=(12.8000+13.0900+13.3500+12.8200+14.6200)/5=13.498s;并行执行时间如表1:表 1 不同进程数目下的并行执行时间(秒)进程数时间(s)2 4 8 16 32 第 1 次19.5309 5.2639 3.4544 3.5604 17.0224 第 2 次20.7678 5.2025 3.6114 3.3591 12.1877 第 3 次19.1435 5.5599 3.0876 2.84
18、31 15.2895 第 4 次18.6376 5.6790 2.7205 2.2458 12.3578 第 5 次17.4724 5.4211 3.6176 3.8152 13.5320 平均值19.1104 5.4253 3.2983 3.1647 14.0779 加速比如表 2:表 2 不同进程数目下的加速比进程数2 4 8 16 32 加速比0.7063 2.4880 4.0924 4.2652 0.9588 图 13 不同进程数下程序的执行时间名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 13 页 -图 14 不同进程数下程序的加速比(2)稀疏矩阵乘法串行执行平均时
19、间T=(12.9000+13.0400+14.2200+12.8000+12.2900)/5=13.0200s;并行执行时间如表3:进程数时间(s)2 4 8 16 32 第 1 次13.6194 5.9733 3.1526 2.6904 10.9137 第 2 次15.2204 6.0063 3.8717 3.0452 7.7873 第 3 次13.0875 5.7812 3.6125 2.3989 8.0696 第 4 次12.8630 5.8452 3.4547 2.5145 9.2154 第 5 次15.2022 5.8014 3.1572 2.7927 10.4716 平均值13.9
20、985 5.8815 3.4497 2.6883 9.2915 加速比如表 4:进程数2 4 8 16 32 加速比0.9301 2.2137 3.7742 4.8432 1.4013 稀疏矩阵乘法程序在不同进程数目下的执行时间和加速比的图跟稠密矩阵差不多,在此就不画了。四.实验结论1.稠密矩阵串并行乘法执行时间分析:并行时,随着进程数目的增多,并行计算的时间越来越短;当达到一定的进程数时,执行时间小到最小值;然后再随着进程数的增多,执行时间反而越来越长。串行时,程序的执行时间基本上趋于稳定。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 13 页 -加速比分析:根据并行计算的
21、执行时间的分析及加速比的公式,可知随着进程数的增大,加速比也是逐渐增大到最大值;再随着进程数的增大,加速比就逐渐减小。结论:并行计算时并不是进程数越多,执行的时间就越短,加速比也就越大。执行时间是从大到小,小到最小值再越来越大;加速比跟执行时间刚好相反变化。1.稠密、稀疏并行乘法从统计的数据中可以看出,无论是串行还是并行计算,稀疏矩阵乘法执行时间要小于稠密矩阵乘法时间。但是由于本程序的稀疏矩阵没有压缩,所以有的数据有点偏差,执行时间的差别不是很大。五.附加内容本实验的源代码及本报告在网上均有上传,下载网址如下:源代码报告名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 13 页 -