欢迎来到天天文库
浏览记录
ID:56495328
大小:249.00 KB
页数:11页
时间:2020-06-25
《计组实验4报告.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、课程实验报告课程名称:计算机组成与结构实验项目名称:perflab-handout专业班级:计科1403姓名:学号:指导教师:黄丽达完成时间:2016年5月28日信息科学与工程学院实验题目:perflab-handout实验目的:本次实验的核心任务是要求修改kernel.c文件,并可以在使用driver进行评测时获得更好的加速比。kernel.c文件中主要有两个需要进行优化的函数:rotate和smooth,并分别给出了naive_rotate和naive_smooth两个函数的基本实现作为baseline作为你改进后的程序的比较对象。本次实验,要求针对每个
2、函数、每个人均至少写出3种优化版本、并根据driver报告的结果进行性能分析。实验环境:联想ThinkPadE545,Ubuntu14(32位)gdb工具实验内容及操作步骤:rotate原始代码分析:voidnaive_rotate(intdim,pixel*src,pixel*dst){inti,j;for(i=0;i3、)*(n)+(j),意思是一个n*n的二维数组的第i行,第j列。所以这段代码的是把一幅画进行逆时针方向旋转90°该函数将所有的像素进行了行列调位、导致整幅图画进行了逆时针90°旋转。分析代码性能不好的因素:原代码由于使用了两重for循环,而且每一重for循环的循环次数为dim次,循环次数过多导致程序的性能非常差,优化方法一是减少循环次数,采用循环展开可以减少循环的次数达到优化效果。优化1:voidrotate(intdim,pixel*src,pixel*dst){inti,j;for(i=0;i4、{dst[RIDX(dim-1-j,i,dim)]=src[RIDX(i,j,dim)];dst[RIDX(dim-1-j,i+1,dim)]=src[RIDX(i+1,j,dim)];}for(;i5、至于cache的命中率非常低,所以总体运算效率不高。因此,我考虑到cache的大小,应在存储的时候进行32个像素依次存储(列存储)。(32个像素排列是为了充分利用一级缓存(32KB),采用分块策略,每一个块大小为32)这样可以做到cache友好、可以大幅度提高效率,同时写优先操作(写地址连续)比原代码的读优先操作(读地址连续)性能会更好。voidrotate(intdim,pixel*src,pixel*dst){inti,j,i1,j1,im,jm;intblock=32;//blockingtheMatrixfor(i=0;i6、for(j=0;j7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
3、)*(n)+(j),意思是一个n*n的二维数组的第i行,第j列。所以这段代码的是把一幅画进行逆时针方向旋转90°该函数将所有的像素进行了行列调位、导致整幅图画进行了逆时针90°旋转。分析代码性能不好的因素:原代码由于使用了两重for循环,而且每一重for循环的循环次数为dim次,循环次数过多导致程序的性能非常差,优化方法一是减少循环次数,采用循环展开可以减少循环的次数达到优化效果。优化1:voidrotate(intdim,pixel*src,pixel*dst){inti,j;for(i=0;i4、{dst[RIDX(dim-1-j,i,dim)]=src[RIDX(i,j,dim)];dst[RIDX(dim-1-j,i+1,dim)]=src[RIDX(i+1,j,dim)];}for(;i5、至于cache的命中率非常低,所以总体运算效率不高。因此,我考虑到cache的大小,应在存储的时候进行32个像素依次存储(列存储)。(32个像素排列是为了充分利用一级缓存(32KB),采用分块策略,每一个块大小为32)这样可以做到cache友好、可以大幅度提高效率,同时写优先操作(写地址连续)比原代码的读优先操作(读地址连续)性能会更好。voidrotate(intdim,pixel*src,pixel*dst){inti,j,i1,j1,im,jm;intblock=32;//blockingtheMatrixfor(i=0;i6、for(j=0;j7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
4、{dst[RIDX(dim-1-j,i,dim)]=src[RIDX(i,j,dim)];dst[RIDX(dim-1-j,i+1,dim)]=src[RIDX(i+1,j,dim)];}for(;i5、至于cache的命中率非常低,所以总体运算效率不高。因此,我考虑到cache的大小,应在存储的时候进行32个像素依次存储(列存储)。(32个像素排列是为了充分利用一级缓存(32KB),采用分块策略,每一个块大小为32)这样可以做到cache友好、可以大幅度提高效率,同时写优先操作(写地址连续)比原代码的读优先操作(读地址连续)性能会更好。voidrotate(intdim,pixel*src,pixel*dst){inti,j,i1,j1,im,jm;intblock=32;//blockingtheMatrixfor(i=0;i6、for(j=0;j7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
5、至于cache的命中率非常低,所以总体运算效率不高。因此,我考虑到cache的大小,应在存储的时候进行32个像素依次存储(列存储)。(32个像素排列是为了充分利用一级缓存(32KB),采用分块策略,每一个块大小为32)这样可以做到cache友好、可以大幅度提高效率,同时写优先操作(写地址连续)比原代码的读优先操作(读地址连续)性能会更好。voidrotate(intdim,pixel*src,pixel*dst){inti,j,i1,j1,im,jm;intblock=32;//blockingtheMatrixfor(i=0;i6、for(j=0;j7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
6、for(j=0;j7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
7、通过减少每次迭代计算元素的数量,减少循环的迭代次数,同时分块可以逐点赋值—>逐行(列)赋值充分利用块空间,防止前面开辟的块还没有完全利用就被后来的覆盖,提高cache命中率。voidrotate(intdim,pixel*src,pixel*dst){inti,j;intdst_base=(dim-1)*dim;dst+=dst_base;for(i=0;i8、t++;*dst=*src;src+=dim;dst
8、t++;*dst=*src;src+=dim;dst
此文档下载收益归作者所有