矩阵乘法的并行化实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

科技大学计算机与通信工程学院

实验报告

实验名称:

学生:

专业:

班级:

学号:

指导教师:

实验成绩:________________________________ 实验地点:

实验时间:2015年05月

一、实验目的与实验要求

1、实验目的

1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论;

2、实验要求

1编写矩阵乘法的串行程序,多次运行得到结果汇总;

2编写基于MPI,分别实现矩阵乘法的并行化。对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。

二、实验设备(环境)及要求

《VS2013》C++语言

MPICH2

三、实验容与步骤

实验1,矩阵乘法的串行实验

(1)实验容

编写串行程序,运行汇总结果。

(2)主要步骤

按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。

实验2矩阵乘法的并行化实验

3个总进程

5个总进程

7个总进程

9个进程

16个进程

四:实验结果与分析(一)矩阵乘法并行化

矩阵并行化算法分析:

并行策略:1间隔行带划分法

算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中

对于矩阵A*B

如图:进程1:矩阵A第一行

进程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+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旗舰版

正确性测试结果:

并行结果:

串行结果:

通过比较发现两者相同,因此可以确定运算结果正确。性能测试结果:

通过对比分析得出,并行算法能够有效提高矩阵乘法的运算效率;

(二)串行算法分析

时间复杂度:

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因为时间紧迫,未能进一步分析代码,同时只用了一种并行算法。六:代码附录

串行算法:

#include

#include

#include

#include

#define N 30

#define M 30

void juzhen_mul(int m, int n, int *p1[M], int m1, int n1, int *p2[M])

{

int i, j, x = 0;

int c[N][M] = { 0 }; 2

for (i = 0; i

{

for (j = 0; j

{

c[i][x] += *(p1[i] + j)**(p2[j] + x); 30*30 m1*m }

printf("%d", c[i][x]);

printf(" "); 2*30 2*m

x++;

if (x == n1)

{

x = 0;

i++;

printf("\n"); 2*30 3*m

}

}

}

void main()

{

double start, finish;

start = (double)clock();

char H;

int i, j;

int *pa[M], *pb[M];

int m = 30, n = 30;

int a[M][N] = { 90, 6, 55, 1, 81, 18, 40, 57, 43, 23, 51, 73, 97, 3, 89, 57, 98, 58, 7, 12, 72, 2, 35, 74, 60, 59, 23, 30, 67, 53,

46, 35, 12, 64, 97, 21, 69, 31, 21, 77, 14, 64, 71, 97, 5, 46, 100, 57, 64, 34, 20, 3, 4, 5, 67, 20, 5, 41, 99, 53,

63, 90, 70, 73, 34, 55, 42, 27, 1, 85, 32, 85, 26, 69, 91, 43, 31, 73, 32, 49, 15, 74, 79, 8, 90, 75, 8, 85, 49, 68,

15, 38, 50, 39, 91, 22, 47, 97, 45, 82, 96, 66, 81, 40, 58, 75, 75, 26, 61, 59, 51, 17, 66, 56, 20, 39, 62, 29, 57, 94,

81, 34, 9, 54, 58, 33, 96, 2, 55, 7, 38, 43, 87, 19, 72, 91, 16, 28, 53, 12, 76, 39, 50, 99, 63, 28, 89, 43, 19, 12,

90, 6, 55, 1, 81, 18, 40, 57, 43, 23, 51, 73, 97, 3, 89, 57, 98, 58, 7, 12, 72, 2, 35, 74, 60, 59, 23, 30, 67, 53,

46, 35, 12, 64, 97, 21, 69, 31, 21, 77, 14, 64, 71, 97, 5, 46, 100, 57, 64, 34, 20, 3, 4, 5, 67, 20, 5, 41, 99, 53,

63, 90, 70, 73, 34, 55, 42, 27, 1, 85, 32, 85, 26, 69, 91, 43, 31, 73, 32, 49, 15, 74, 79, 8, 90, 75, 8, 85, 49, 68,

15, 38, 50, 39, 91, 22, 47, 97, 45, 82, 96, 66, 81, 40, 58, 75, 75, 26, 61, 59, 51, 17, 66, 56, 20, 39, 62, 29, 57, 94,

81, 34, 9, 54, 58, 33, 96, 2, 55, 7, 38, 43, 87, 19, 72, 91, 16, 28, 53, 12, 76, 39, 50, 99, 63, 28, 89, 43, 19, 12,

90, 6, 55, 1, 81, 18, 40, 57, 43, 23, 51, 73, 97, 3, 89, 57, 98, 58, 7, 12, 72, 2, 35, 74, 60, 59, 23, 30, 67, 53,

相关文档
最新文档