. .
深 圳 大 学
实 验 报 告
课程名称:并行计算
实验名称:矩阵乘法的 OpenMP实现与性能分析
姓 名:
学号:
班 级:
实验日期: 2011 年 10 月 21 日、 11 月 4 日
一 . 实验目的
1) 用 OpenMP实现最基本的数值算法“矩阵乘法”
1 / 8
. .
2) 掌握 for 编译制导语句
3) 对并行程序进行简单的性能
二 . 实验环境
1) 硬件环境: 32 核 CPU、 32G存计算机;
2) 软件环境: Linux 、 Win2003、 GCC、MPICH、 VS2008;
4) Windows 登录方式:通过远程桌面连接 192.168.150.197 ,用户名和初始密码都是自己的
学号。
三 . 实验容
1. 用 OpenMP编写两个 n 阶的方阵 a 和 b 的相乘程序,结果存放在方阵 for 编译制导语句实现并行化操作 ,并调节 for 编译制导中 schedule 间最短,写出代码。
方阵 a 和 b 的初始值如下:
, , ,...,12
, , ,...,
, , ,...,a 3
, , ,...,
a 3 4 5 n
, , ,...,
.
.
n n
n n 1 n
11 1 1,
11 1 1
1 11 1
1 11 1 1
2 b 11
2 b 11 1 1
.
.
2 ,...,2n 1
2 ,...,2n 1 1 1 1 1
c 中, 其中乘法用
的参数,使得执行时
输入:
方阵的阶 n、并行域的线程数
输出:
c 中所有元素之和、程序的执行时间
提示:
a,b,c 的元素定义为 int 型, c 中所有元素之各定义为 long long 型。
Windows 计时 :
用time.h 中的 clock_t clock( void ) Linux 计时 :
#include sys/time.h
timeval start,end;
gettimeofday(start,NULL); gettimeofday(end,NULL);
函数得到当前程序执行的时间
2 / 8
. .
coutexecution
time:(end.tv_sec-start.tv_sec)+(double)(end.tv_usec-start.tv_usec)/10000
00seconds endl;
答:
在 windows 下使用 Microsofe Visual Studio 编程,源代码如下:
#include omp.h
#include stdio.h
#include time.h
#define NN 2000
int a[NN][NN], b[NN][NN];
longlong c[NN][NN];
void solve( int n, int num_thread)
{
int i, j, t, k, time;
clock_t startTime, endTime;
longlong sum;
omp_set_num_threads(num_thread);
for (i=0;in;i++) // 对矩阵 a和矩阵 b进行初始化
{
t=i+1;
for (j=0;jn;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)
3 / 8
. .
for (i=0;in;i++)
{
for (j=0;jn;j++)
{
c[i][j]=0;
for (k=0;kn;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
}
for (i=0;
原创力文档

文档评论(0)