1、 姓 名 学 号 专 业 班 级 联 系 电 话 Email 同 组实验者 无 无 实验室名 称 信息楼301室 实 验日 期 2013.7.6 课 程名 称 计算机系统结构 实 验 序 号 七 实 验项 目 基于Cache的矩阵乘积算法性能改善实验 主 讲教 师 辅 导教 师 指 导教 师 实验心得: (1)通过本次试验,我了解Cache对系统性能的影响; (2)了解了基于系统结构的算法设计思想; 学生签名: 2013年 7 月 6 日 成
2、绩评定及教师评语: 成绩: 教师签名: 2013 年 7 月6 日 1 实验目的及要求 ★了解Cache对系统性能的影响 ★了解基于系统结构的算法设计思想 2 实验模块及实验原理 2.1 实验模块 (1)编写两个C语言程序。一个是实现矩阵乘积的一般算法。另一个是基于Cache的矩阵乘积优化算法。 (2) 采用不同矩阵大小来进行多组测量,使实验的结果更加准确。 2.2 实验原理 本实验采用控制变量的方法。矩阵大小相同时比较两算法的优略。在相同算法中采用改变矩阵大小的方式,
3、使结果更加准确。 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.
4、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的矩阵(方阵)乘积优化算法,填写下表:
5、矩阵大小 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 矩
6、阵大小: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 加速
7、比:1.63
矩阵大小:2500 加速比:1.63
矩阵大小:3000 加速比:3.05
加速比定义:加速比=优化前系统耗时/优化后系统耗时;
所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。
4 实验代码
程序1:
#include
8、uct timeval time1,time2;
if(argc<2)
{
printf("\n\tUsage:%s 9、)
{
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 10、1.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 11、c,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 12、m);
c=(float*)malloc(sizeof(float)*m);
for(i=0;i 13、)
for(j=0;j






