ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:1.18MB ,
资源ID:27643096      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27643096.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(并行处理实验报告用MPI实现的矩阵乘法的加速比分析推荐文档.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

并行处理实验报告用MPI实现的矩阵乘法的加速比分析推荐文档.docx

1、并行处理实验报告用MPI实现的矩阵乘法的加速比分析推荐文档华 中 科 技 大 学课程名称 并行处理实验名称 矩阵乘法的实现及加速比分析考生姓名 李佩佩考生学号 M*系、年级 计算机软件与理论2013级类 别 硕士研究生考试日期 2014年1月3日一. 实验目的1) 学会如何使用集群2) 掌握怎么用并行或分布式的方式编程3) 掌握如何以并行的角度分析一个特定的问题二. 实验环境1) 硬件环境:4核CPU、2GB内存计算机;2) 软件环境: Windows XP、MPICH2、VS2010、Xmanager Enterprise3;3) 集群登录方式:通过远程桌面连接211.69.198.2,用户

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的时间间隔非常短,又由于sran

4、d()函数的特点,导致生成的矩阵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+) Mi = rand() % 2; for(i=0;ilen;i+) for(j=0;jl

5、en;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,对于串行计算,只需要np=1;输出:程序的

6、执行时间。在Windows XP下使用Microsoft Visual Studio2010编程,由于稀疏矩阵和稠密矩阵的代码只是初始化部分不同,所以以稠密矩阵乘法为例,列出并行和串行的源代码。并行计算的矩阵乘法源代码:DenseMulMatrixMPI.c#include #include #include #include #define Length 1000int *A,*B,*C,*buffer,*ans;int temp,i,j,k; int procsID,procsNum,line;double startTime,endTime,totalTime; void InitMat

7、rix(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,&procsNum);/获取进程数目line = Length/procsNum;/将数据分为(进程数)个块

8、 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); startTime = MPI_Wtime(); for (i=1

9、;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+) for (j=0;jLength;j+) C(k-1)*line+i

10、)*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);/if else MPI_Recv(B,Length*Length,MPI_INT

11、,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_WORLD); /else MPI_Finalize(); del

12、(); return 0;串行计算的矩阵乘法源代码:DenseMulMatrixSerial.c#include #include #include #define Length 1000int *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);int main() A = (int *)malloc(sizeof(int)*Length*Length)

13、; 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; /for end

14、Time = clock(); totalTime = (double)(endTime - startTime) / CLOCKS_PER_SEC; printf(串行稠密矩阵乘法过程总共花的时间:%.4fsn,totalTime); del(); return 0;2.执行时间截图代码部分完成后,就要传到集群上去运行。以下的截图是我在集群上运行程序的时间。DensMulMatrixSerial.c: 图1 稠密矩阵串行乘法DenseMulMatrixMPI.c,np=2: 图2 np=2的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=4: 图3 np=4的稠密矩阵并行乘法D

15、enseMulMatrixMPI.c,np=8: 图4 np=8的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=16: 图5 np=16的稠密矩阵并行乘法DenseMulMatrixMPI.c,np=32: 图6 np=32的稠密矩阵并行乘法SparseMulMatrixSerial.c 图7稀疏矩阵串行乘法SparseMulMatrixMPI.c,np=2: 图8 np=2的稀疏矩阵并行乘法SparseMulMatrixMPI.c,np=4: 图9 np=4的稀疏矩阵并行乘法SparseMulMatrixMPI.c,np=8: 图10 np=8的稀疏矩阵并行乘法SparseM

16、ulMatrixMPI.c,np=16: 图11 np=16的稀疏矩阵并行乘法SparseMulMatrixMPI.c,np=32: 图12 np=32的稀疏矩阵并行乘法3.统计数据 分析矩阵相乘程序的执行时间、加速比:方阵阶固定为1000,为减少误差,每项实验进行5次,取平均值作为实验结果(一切时间数据均以以上截图为准)。所用到的公式:加速比=顺序执行时间/并行执行时间(1)稠密矩阵乘法串行执行平均时间T = (12.8000+13.0900+13.3500+12.8200+14.6200)/5=13.498s;并行执行时间如表1:表1 不同进程数目下的并行执行时间(秒) 进程数时间(s)2

17、481632第1次19.53095.26393.45443.560417.0224第2次20.76785.20253.61143.359112.1877第3次19.14355.55993.08762.843115.2895第4次18.63765.67902.72052.245812.3578第5次17.47245.42113.61763.815213.5320平均值19.11045.42533.29833.164714.0779加速比如表2: 表2 不同进程数目下的加速比进程数2481632加速比0.70632.48804.09244.26520.9588 图13 不同进程数下程序的执行时间

18、图14 不同进程数下程序的加速比(2)稀疏矩阵乘法串行执行平均时间T = (12.9000+13.0400+14.2200+12.8000+12.2900)/5=13.0200s;并行执行时间如表3: 进程数时间(s)2481632第1次13.61945.97333.15262.690410.9137第2次15.22046.00633.87173.04527.7873第3次13.08755.78123.61252.39898.0696第4次12.86305.84523.45472.51459.2154第5次15.20225.80143.15722.792710.4716平均值13.99855.

19、88153.44972.68839.2915加速比如表4:进程数2481632加速比0.93012.21373.77424.84321.4013稀疏矩阵乘法程序在不同进程数目下的执行时间和加速比的图跟稠密矩阵差不多,在此就不画了。四. 实验结论1. 稠密矩阵串并行乘法执行时间分析:并行时,随着进程数目的增多,并行计算的时间越来越短;当达到一定的进程数时,执行时间小到最小值;然后再随着进程数的增多,执行时间反而越来越长。串行时,程序的执行时间基本上趋于稳定。加速比分析:根据并行计算的执行时间的分析及加速比的公式,可知随着进程数的增大,加速比也是逐渐增大到最大值;再随着进程数的增大,加速比就逐渐减小。结论:并行计算时并不是进程数越多,执行的时间就越短,加速比也就越大。执行时间是从大到小,小到最小值再越来越大;加速比跟执行时间刚好相反变化。1. 稠密、稀疏并行乘法从统计的数据中可以看出,无论是串行还是并行计算,稀疏矩阵乘法执行时间要小于稠密矩阵乘法时间。但是由于本程序的稀疏矩阵没有压缩,所以有的数据有点偏差,执行时间的差别不是很大。五. 附加内容本实验的源代码及本报告在网上均有上传,下载网址如下:源代码报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1