矩阵乘法的并行化实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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,