欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)(共13页).doc

    • 资源ID:14268851       资源大小:2.19MB        全文页数:13页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)(共13页).doc

    精选优质文档-倾情为你奉上华 中 科 技 大 学课程名称 并行处理实验名称 矩阵乘法的实现及加速比分析考生姓名 李佩佩考生学号 M系、年级 计算机软件与理论2013级类 别 硕士研究生考试日期 2014年1月3日一.实验目的1) 学会如何使用集群2) 掌握怎么用并行或分布式的方式编程3) 掌握如何以并行的角度分析一个特定的问题二.实验环境1) 硬件环境:4核CPU、2GB内存计算机;2) 软件环境: Windows XP、MPICH2、VS2010、Xmanager Enterprise3;3) 集群登录方式:通过远程桌面连接211.69.198.2,用户名:pppusr,密码:AE2Q3P0。三.实验内容1. 实验代码编写四个.c文件,分别为DenseMulMatrixMPI.c、DenseMulMatrixSerial.c、SparseMulMatrixMPI.c和SparseMulMatrixSerial.c,用于比较并行和串行矩阵乘法的加速比,以及稀疏矩阵和稠密矩阵的加速比。这里需要说明一下,一开始的时候我是把串、并行放在一个程序中,那么就只有两个.c文件DenseMulMatrix.c和SparseMulMatrix.c,把串行计算矩阵乘的部分放到了主进程中,即procsID=0的进程,但是结果发现执行完串行后,再执行并行就特别的慢。另外,对于稀疏矩阵的处理方面可能不太好,在生成稀疏矩阵的过程中非0元素位置的生成做到了随机化,但是在进行稀疏矩阵乘法时没有对矩阵压缩,所以跟稠密矩阵乘法在计算时间上没多大区别。方阵A和B的初始值是利用rand()和srand()函数随机生成的。根据稀疏矩阵和稠密矩阵的定义,对于稀疏矩阵和稠密矩阵的初始化方法InitMatrix(int *M,int *N,int len)会有所不同。这里需要说明一下,一开始对于矩阵A和B的初始化是两次调用InitMatrix(int *M ,int len),生成A和B矩阵,但是随后我发现,由于两次调用方法InitMatrix的时间间隔非常短,又由于srand()函数的特点,导致生成的矩阵A和B完全一样;然后,我就在两次调用之间加入了语句“Sleep(1000);”,加入头文件“#include <windows.h>” ,这样生成的A、B矩阵就不一样了,但很快问题又出现了,在Xshell中不能识别头文件“#include <windows.h>”。所以,最后决定用下面的方法生成矩阵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;i<len;i+)for(j=0;j<len;j+)Ni*len+j=Mj*len+i;/稀疏矩阵的生成方法void InitMatrix(int *M, int *N, int len) for(i=0;i<len*len;i+)Mi=0;srand(unsigned)time( NULL);for(m=0;m<224;m+)for(n=0;n<224;n+)i=rand()%len;j=rand()%len;Mi*len+j=1;for(i=0;i<len;i+)for(j=0;j<len;j+)Ni*len+j=Mj*len+i;输入:并行执行的进程数procsNum,对于串行计算,只需要np=1;输出:程序的执行时间。在Windows XP下使用Microsoft Visual Studio2010编程,由于稀疏矩阵和稠密矩阵的代码只是初始化部分不同,所以以稠密矩阵乘法为例,列出并行和串行的源代码。并行计算的矩阵乘法源代码:DenseMulMatrixMPI.c#include <stdio.h>#include <stdlib.h>#include <mpi.h>#include <time.h>#define Length 1000int *A,*B,*C,*buffer,*ans;int temp,i,j,k; int procsID,procsNum,line;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,&procsNum);/获取进程数目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); startTime = MPI_Wtime(); for (i=1;i<procsNum;i+) MPI_Send(B,Length*Length,MPI_INT,i,0,MPI_COMM_WORLD); for (i=1;i<procsNum;i+) MPI_Send(A+(i-1)*line*Length,Length*line,MPI_INT,i,1,MPI_COMM_WORLD); for (k=1;k<procsNum;k+) MPI_Recv(ans,line*Length,MPI_INT,k,3,MPI_COMM_WORLD,&status); for (i=0;i<line;i+) for (j=0;j<Length;j+) C(k-1)*line+i)*Length+j =ansi*Length+j; for (i=(procsNum-1)*line;i<Length;i+) for (j=0;j<Length;j+) temp=0; for (k=0;k<Length;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,0,0,MPI_COMM_WORLD,&status); MPI_Recv(buffer,Length*line,MPI_INT,0,1,MPI_COMM_WORLD,&status); for (i=0;i<line;i+) for (j=0;j<Length;j+) temp=0; for(k=0;k<Length;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(); return 0;串行计算的矩阵乘法源代码:DenseMulMatrixSerial.c#include <stdio.h>#include <stdlib.h>#include <time.h>#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);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 = 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的稠密矩阵并行乘法DenseMulMatrixMPI.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的稀疏矩阵并行乘法SparseMulMatrixMPI.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)2481632第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 不同进程数下程序的执行时间图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.88153.44972.68839.2915加速比如表4:进程数2481632加速比0.93012.21373.77424.84321.4013稀疏矩阵乘法程序在不同进程数目下的执行时间和加速比的图跟稠密矩阵差不多,在此就不画了。四.实验结论1. 稠密矩阵串并行乘法执行时间分析:并行时,随着进程数目的增多,并行计算的时间越来越短;当达到一定的进程数时,执行时间小到最小值;然后再随着进程数的增多,执行时间反而越来越长。串行时,程序的执行时间基本上趋于稳定。加速比分析:根据并行计算的执行时间的分析及加速比的公式,可知随着进程数的增大,加速比也是逐渐增大到最大值;再随着进程数的增大,加速比就逐渐减小。结论:并行计算时并不是进程数越多,执行的时间就越短,加速比也就越大。执行时间是从大到小,小到最小值再越来越大;加速比跟执行时间刚好相反变化。1. 稠密、稀疏并行乘法从统计的数据中可以看出,无论是串行还是并行计算,稀疏矩阵乘法执行时间要小于稠密矩阵乘法时间。但是由于本程序的稀疏矩阵没有压缩,所以有的数据有点偏差,执行时间的差别不是很大。五.附加内容本实验的源代码及本报告在网上均有上传,下载网址如下:源代码报告专心-专注-专业

    注意事项

    本文(并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)(共13页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开