并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)_第1页
并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)_第2页
并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)_第3页
并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)_第4页
并行处理实验报告:用MPI实现的矩阵乘法的加速比分析(推荐文档)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上华 中 科 技 大 学课程名称 并行处理实验名称 矩阵乘法的实现及加速比分析考生姓名 李佩佩考生学号 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

2、。三.实验内容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的时间间隔非常短,又由于srand()函数的特点,导致生成的矩阵A和B完

4、全一样;然后,我就在两次调用之间加入了语句“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<

5、;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;输入:并行执行的进程数p

6、rocsNum,对于串行计算,只需要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

7、 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

8、);/获取当前进程号 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(

9、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_R

10、ecv(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; e

11、ndTime = 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+) tem

12、p=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

13、 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);In

14、itMatrix(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("串

15、行稠密矩阵乘法过程总共花的时间:%.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的稠密矩阵并行乘法

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.统计数据

17、 分析矩阵相乘程序的执行时间、加速比:方阵阶固定为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.559

18、93.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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论