湖南大学课程实验报告
课程名称:计算机组成与结构
实验项目名称:perflab
专业班级:
姓名:
学号:
指导教师:
完成时间:2015 年05 月22 日
计算机科学与工程系
rotate函数:
void rotate(int dim, pixel *src, pixel *dst)
{
int i,j,ii,jj;
for(ii=0;ii<dim;ii+=4)
for(jj=0;jj<dim;jj+=4)
for(i=ii;i<ii+4;i++)
for(j=jj;j<jj+4;j++)
dst[RIDX(dim-1-j,i,dim)]=src[RIDX(i,j,dim)];
}
多添加了两个for函数,将循环分成了4*4的小块,在cache存储体不足够大的情况下,对循环分块能够提升高速缓存命中率,从高提升了空间局部性。
从测试的CPE中也可以看出,在dim 是64的时候,原代码和本代码CPE相差不大,而随着dim的增大,本代码CPE增加不大,而原代码CPE急剧增加,就是受到了cache存储的局限性。
smooth函数:
void smooth(int dim, pixel *src, pixel *dst)
{
pixel_sum rowsum[530][530];
dst[RIDX(dim-1, j, dim)].red = (unsigned
short)((rowsum[dim-2][j].red+rowsum[dim-1][j].red)/snum);
dst[RIDX(dim-1, j, dim)].blue = (unsigned
short)((rowsum[dim-2][j].blue+rowsum[dim-1][j].blue)/snum);
dst[RIDX(dim-1, j, dim)].green = (unsigned
short)((rowsum[dim-2][j].green+rowsum[dim-1][j].green)/snum);
}
}
本函数取消调用了avg函数,通过在函数中直接对像素点的三原色比例分别求平均值的方法来求像素的平均值。
因为取消了avg函数的调用,减少了大多数函数调用环节,并且将重复利用的数据储存在了数组之中,因此提升了速度。
但是本方法提升的速度不够显著。
仅是在dim较小的情况下才有较好的优化。
且当dim>512时,超出了设置的数组大小会报错。
第二种版本:
CPE分析:
rotate函数:
void rotate(int dim, pixel *src, pixel *dst)
{
dst->blue=(P1->blue+(P1+1)->blue+(P1+2)->blue+P2->blue+(P2+1)->blue+(P2+2)->blue)/6;
dst++;
P1++;
P2++;
}
dst->red=(P1->red+(P1+1)->red+P2->red+(P2+1)->red)>>2;
dst->green=(P1->green+(P1+1)->green+P2->green+(P2+1)->green)>>2;
dst->blue=(P1->blue+(P1+1)->blue+P2->blue+(P2+1)->blue)>>2;
}
这段代码也是通过不调用avg函数来加速程序。
将Smooth函数处理分为4块,一为主体内部,由9点求平均值;二为4个顶点,由4点求平均值;三为四条边界,由6点求平均值。
从图片的顶部开始处理,再上边界,顺序处理下来,其中在处理左边界时,for循环处理一行主体部分,就是以上的代码。
第三种版本:
CPE分析:。