资源描述
姓 名
学 号
专 业
班 级
联 系
电 话
Email
同 组实验者
无
无
实验室名 称
信息楼301室
实 验日 期
2013.7.6
课 程名 称
计算机系统结构
实 验 序 号
七
实 验项 目
基于Cache的矩阵乘积算法性能改善实验
主 讲教 师
辅 导教 师
指 导教 师
实验心得:
(1)通过本次试验,我了解Cache对系统性能的影响;
(2)了解了基于系统结构的算法设计思想;
学生签名: 2013年 7 月 6 日
成绩评定及教师评语:
成绩: 教师签名: 2013 年 7 月6 日
1 实验目的及要求
★了解Cache对系统性能的影响
★了解基于系统结构的算法设计思想
2 实验模块及实验原理
2.1 实验模块
(1)编写两个C语言程序。一个是实现矩阵乘积的一般算法。另一个是基于Cache的矩阵乘积优化算法。
(2) 采用不同矩阵大小来进行多组测量,使实验的结果更加准确。
2.2 实验原理
本实验采用控制变量的方法。矩阵大小相同时比较两算法的优略。在相同算法中采用改变矩阵大小的方式,使结果更加准确。
3 实验步骤与结果
3.1 实验步骤
(1)编译并运行程序1,记录相关数据。
(2)不改变矩阵大小时,编译并运行程序2,记录相关数据。
(3)改变矩阵大小,重复(1)、(2)两步。
(4)通过以上的实验现象,分析出现这种现象的原因。
3.2 实验结果
1.用C语言实现矩阵(方阵)乘积一般算法(程序1),填写下表:
矩阵大小
100
500
1000
1500
2000
2500
3000
一般算法执行时间
0. 15625
2. 62500
20.171875
73.718750
167. 93750
394.828125
1099. 31250
矩阵大小:100 一般算法执行时间:0.15625
矩阵大小:500 一般算法执行时间:2. 62500
矩阵大小:1000 一般算法执行时间:20.171875
矩阵大小:1500 一般算法执行时间:73.718750
矩阵大小:2000 一般算法执行时间:167. 93750
矩阵大小:2500 一般算法执行时间:394.828125
矩阵大小:3000 一般算法执行时间:1099. 31250
2.程序2是基于Cache的矩阵(方阵)乘积优化算法,填写下表:
矩阵大小
100
500
1000
1500
2000
2500
3000
优化算法执行时间
0. 15625
1.562500
12.625000
42.875000
102.171875
202.796875
360. 31250
矩阵大小:100 优化算法执行时间:0.15625
矩阵大小:500 优化算法执行时间:1.562500
矩阵大小:1000 优化算法执行时间:12.625000
矩阵大小:1500 优化算法执行时间:42.875000
矩阵大小:2000 优化算法执行时间:102.171875
矩阵大小:2500 优化算法执行时间:202.796875
矩阵大小:3000 优化算法执行时间:360. 31250
3.优化后的加速比(speedup)
矩阵大小
100
500
1000
1500
2000
2500
3000
加速比
1
1.68
1.598
1.72
1.63
1.63
3.05
矩阵大小:100 加速比:0.15625
矩阵大小:500 加速比:1.68
矩阵大小:1000 加速比:1.598
矩阵大小:1500 加速比:1.72
矩阵大小:2000 加速比:1.63
矩阵大小:2500 加速比:1.63
矩阵大小:3000 加速比:3.05
加速比定义:加速比=优化前系统耗时/优化后系统耗时;
所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。
4 实验代码
程序1:
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
main(int argc,char *argv[])
{
float *a,*b,*c,temp;
long int i,j,k,size,m;
struct timeval time1,time2;
if(argc<2)
{
printf("\n\tUsage:%s <Row of square matrix>\n",argv[0]);
exit(-1);
}
size=atoi(argv[1]);
m=size*size;
a=(float*)malloc(sizeof(float)*m); b=(float*)malloc(sizeof(float)*m); c=(float*)malloc(sizeof(float)*m); for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
a[i*size+j]=(float)(rand()%1000/100.0); b[i*size+j]=(float)(rand()%1000/100.0);
}
gettimeofday(&time1,NULL);
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
c[i*size+j]=0;
for(k=0;k<size;k++)
c[i*size+j]+=a[i*size+k]*b[k*size+j];
}
gettimeofday(&time2,NULL); time2.tv_sec-=time1.tv_sec; time2.tv_usec-=time1.tv_usec;
if(time2.tv_usec<0L)
{
time2.tv_usec+=1000000L;
time2.tv_sec-=1;
}
printf("Executiontime=%ld.%6ld seconds\n",time2.tv_sec,time2.tv_usec);
}
return(0);
}
程序2:
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
main(int argc,char *argv[])
{
float *a,*b,*c,temp;
long int i,j,k,size,m;
struct timeval time1,time2;
if(argc<2)
{
printf("\n\tUsage:%s <Row of square matrix>\n",argv[0]);
exit(-1);
}
size=atoi(argv[1]);
m=size*size;
a=(float*)malloc(sizeof(float)*m);
b=(float*)malloc(sizeof(float)*m);
c=(float*)malloc(sizeof(float)*m);
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
a[i*size+j]=(float)(rand()%1000/100.0);
c[i*size+j]=(float)(rand()%1000/100.0);
}
gettimeofday(&time1,NULL);
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
b[i*size+j]=c[j*size+i];
for(i=0;i<size;i++)
for(j=0;j<size;j++)
{
c[i*size+j]=0;
for(k=0;k<size;k++)
c[i*size+j]+=a[i*size+k]*b[j*size+k];
}
gettimeofday(&time2,NULL);
time2.tv_sec-=time1.tv_sec;
time2.tv_usec-=time1.tv_usec;
if(time2.tv_usec<0L)
{
time2.tv_usec+=1000000L;
time2.tv_sec-=1;
}
printf("Executiontime=%ld.%6ld seconds\n",time2.tv_sec,time2.tv_usec);
}
return(0);
}
5 实验结果分析
(1)对于矩阵乘法,用一般算法执行时,执行时间随着矩阵的增大变化较大。
(2)用优化算法执行时,执行时间随着矩阵的增大变化较小。
(3)由加速比计算结果可清晰看到在矩阵比较小时,优化前后区别不大;随着矩阵规模变大,加速就比较明显了。
展开阅读全文