(完整word版)矩阵乘法的OpenMP实现及性能分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一. 实验目的
1) 用OpenMP 实现最基本的数值算法“矩阵乘法” 2) 掌握for 编译制导语句 3) 对并行程序进行简单的性能
二. 实验环境
1) 硬件环境:32核CPU 、32G 内存计算机;
2) 软件环境:Linux 、Win2003、GCC 、MPICH 、VS2008;
4) Windows 登录方式:通过远程桌面连接192.168.150.197,用户名和初始密码都是自己的学号。
三. 实验内容
1. 用OpenMP 编写两个n 阶的方阵a 和b 的相乘程序,结果存放在方阵c 中,其中乘法用for 编译制导语句实现并行化操作,并调节for 编译制导中schedule 的参数,使得执行时间最短,写出代码。 方阵a 和b 的初始值如下:
⎥⎥⎥⎥⎥⎥⎥⎥⎦
⎤
⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-++++=12,...,2,1,..2,...,5,4,31,...,4,3,2,...,3,2,1n n n n n n n a ⎥⎥⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=
1,...,1,1,1..1,...,1,1,11,...,1,1,11,...,
1,1,1b 输入:
方阵的阶n 、并行域的线程数 输出:
c 中所有元素之和、程序的执行时间 提示:
a,b,c 的元素定义为int 型,c 中所有元素之各定义为long long 型。 Windows 计时:
用
gettimeofday(&start,NULL);
gettimeofday(&end,NULL);
cout<<"execution time:"<< (__sec)+(double)(__usec)/ 1000000<<"seconds" < 答: 在windows下使用Microsofe Visual Studio编程,源代码如下: #include #include #include #define NN 2000 int a[NN][NN], b[NN][NN]; long long c[NN][NN]; void solve(int n, int num_thread) { int i, j, t, k, time; clock_t startTime, endTime; long long sum; omp_set_num_threads(num_thread); for(i=0;i { t=i+1; for(j=0;j { a[i][j]=t++; b[i][j]=1; } } startTime=clock(); sum=0; #pragma omp parallel shared(a,b,c) private(i,j,k) { #pragma omp for schedule(dynamic) for(i=0;i { for(j=0;j { c[i][j]=0; for(k=0;k { c[i][j]+=a[i][k]*b[k][j]; } } } } for(i=0;i endTime=clock(); time=endTime-startTime; printf("sum=%lld time=%dms\n",sum,time); } int main() { int n, num_thread; while(scanf("%d%d",&n,&num_thread)!=EOF) { solve(n,num_thread); } return 0; } 2.分析矩阵相乘程序的执行时间、加速比和效率:方阵阶固定为1000,节点数分别取1、2、4、8、16和32时,为减少误差,每项实验进行5次,取平均值作为实验结果。 答:串行执行时程序的执行时间为:T = 15.062s 加速比=顺序执行时间/并行执行时间 效率=加速比/节点数 表1 不同节点数下程序的执行时间(秒) 第1次 16.640 8.172 4.078 2.125 1.093 0.594 第2次 16.422 8.156 4.172 2.141 1.078 0.578 第3次 16.406 8.266 4.078 2.125 1.094 0.563 第4次 16.781 8.172 4.079 2.109 1.094 0.563 第5次 16.422 8.171 4.078 2.125 1.093 0.578 平均值 16.5342 8.1874 4.0970 2.1250 1.0904 0.5752 图1 不同节点数下程序的执行时间