OpenMP 之 矩阵乘法实现 (星星笔记)

来源:互联网 发布:色彩搭配书籍推荐 知乎 编辑:程序博客网 时间:2024/06/05 07:51

用OpenMP编写两个n阶的方阵A和B的相乘程序,结果存放在方阵C中,其中乘法用for编译制导语句实现并行化操作,并调节for编译制导中schedule的参数,使得执行时间最短。

方阵A和B的初始值如下:


方阵的阶n、并行域的线程数

输出:c中所有元素之和、程序的执行时间

具体的程序如下:

// ZhenLiu.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <omp.h>#include <stdio.h>#include <time.h>#define NN 2000int A[NN][NN], B[NN][NN];long long C[NN][NN];void solve(int n, int num_thread){int i, j, t, k, paralleltime,serialtime;clock_t startTime, endTime;long long sum;omp_set_num_threads(num_thread);//--------------对矩阵A和矩阵B进行初始化-------------for(i=0;i<n;i++)   {t=i+1;for(j=0;j<n;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<n;i++){for(j=0;j<n;j++){C[i][j]=0;for(k=0;k<n;k++){C[i][j]+=A[i][k]*B[k][j];}}}}for(i=0;i<n;i++)for(j=0;j<n;j++) sum+=C[i][j];endTime=clock();paralleltime=endTime-startTime;printf("矩阵C所有元素和为sum=%lld 并行计算时间time=%dms\n",sum,paralleltime);//--------------------------------------------------------//--------------------------------------------------------startTime = clock();sum = 0;for(i=0;i<n;i++){for(j=0;j<n;j++){C[i][j]=0;for(k=0;k<n;k++){C[i][j]+=A[i][k]*B[k][j];}}}for(i=0;i<n;i++)for(j=0;j<n;j++) sum+=C[i][j];endTime = clock();serialtime=endTime-startTime;printf("矩阵C所有元素和为sum=%lld 串行计算时间time=%dms\n",sum,serialtime);printf("相对加速比为: %d/%d\n",serialtime,paralleltime);//----------------------------------------------------}int _tmain(int argc, _TCHAR* argv[]){int n, num_thread;printf("------------------ 软件工程 星星笔记 ------------------\n");printf("请输入矩阵的节数(整数N<=2000),再输入并行的线程数。\n\n");while(scanf("%d%d",&n,&num_thread)!=EOF){printf("你输入的矩阵节数为:%d并行线程数为:%d\n",n,num_thread);solve(n,num_thread);}return 0;}
运行结果如下图:


0 0
原创粉丝点击