perflab实验报告.doc_第1页
perflab实验报告.doc_第2页
perflab实验报告.doc_第3页
perflab实验报告.doc_第4页
perflab实验报告.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: perflab-handout 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 杨科华 完 成 时 间: 2016 年 5 月 27 日信息科学与工程学院实验题目:perflab程序性能调优实验目的:理解编译器,学习程序优化,从优化程序代码和程序执行速度两方面着手。实验要求:本次实验,要求针对每个函数、每个人均至少写出3种优化版本、并根据driver报告的结果进行性能分析实验环境: ubuntu-15.10、 x32系统 、VMware workstation实验内容及操作步骤:将下载下来的 kernels.c 中的 rotate、smooth 函数进行优化。rotate函数的作用是将图像逆时针旋转90,smooth函数的作用是对于图像中的每一个像素点,取它和周围的像素点的平均值,让图片变得模糊。下面对代码进行逐一优化。源代码的CPE测试:1.Naive_rotate 1)源代码:char naive_rotate_descr = naive_rotate: Naive baseline implementation;void naive_rotate(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i dim; i+)for (j = 0; j dim; j+) dstRIDX(dim-1-j, i, dim) = srcRIDX(i, j, dim);2)分析:这段代码的作用就是用一个双层循环将所有的像素进行行列调位、导致整幅图画进行了 90 度旋转。然而分析一下代码就能发现一个十分简单的优化方法:因为在最内层循环中,j的值每次都会改变,所以每执行一次赋值就要计算一次dim-1-j,算多了自然就慢了。我们可以利用简单的数学技巧改写公式,将赋值语句改成dstRIDX(i, j, dim) = srcRIDX(j, dim-i-1, dim); 这样就不用每次都计算了。3)优化代码1如下:char naive_rotate_descr2 = naive_rotate2: only change the place of i and j;void naive_rotate2(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i dim; i+) for (j = 0; j dim; j+) dstRIDX(i, j, dim) = srcRIDX(j, dim-i-1, dim);/i change less 优化结果如下:这是一种最为简单的优化方案,由图可知,速度提升不大,性能优化结果也不是很好。再分析源代码,从 cache 友好性来分析,这个代码的效率机会很低, 所以按照 cache 的大小, 应在存储的时候进行 32 个像素依次存储 (列 存储)。做到 cache 友好这样就可以可以大幅度提高效率。4)优化代码2如下:char rotate_descr2 = rotate2: version2breakinto4*4blocks; void rotate2(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+) dstRIDX(dim-1-j,i,dim) = srcRIDX(i,j,dim); 优化结果如下:用分块的方式,进行优化。将整个程序分成4*4的小块,提高空间局部性5)优化代码3如下:char rotate_descr3 = rotate3: version3 break into 32*32 blocks;void rotate3(int dim, pixel *src, pixel *dst) int i, j,ii,jj; for(ii=0; ii dim; ii+=32)for(jj=0; jj dim; jj+=32)for(i=ii; i ii+32; i+)for(j=jj; j jj+32; j+) dstRIDX(dim-1-j,i,dim) = srcRIDX(i,j,dim); 优化结果如下:分成32*32块,提高空间局部性6)优化代码4如下:char rotate_descr4 = rotate4: Current working version,using pointer rather than computing address;void rotate4(int dim, pixel *src, pixel *dst) int i; int j; int tmp1=dim*dim; int tmp2=dim *31; int tmp3=tmp1-dim; int tmp4=tmp1+32; int tmp5=dim+31; dst+=tmp3; for(i=0; i dim; i+=32) for(j=0;jdim;j+) *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; dst+;src+=dim; *dst=*src; src+; src-=tmp2; dst-=tmp5; src+=tmp2; dst+=tmp4; 优化结果如下:用循环展开,分成32路并行来写2.Naive_smooth1)源代码char naive_smooth_descr = naive_smooth: Naive baseline implementation;void naive_smooth(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i dim; i+)for (j = 0; j dim; j+) dstRIDX(i, j, dim) = avg(dim, i, j, src);CPES性能如下:2)分析这段代码很多次地调用 avg 函数,而 avg 函数内也频繁调用 initialize_pixel_sum 、 accumulate_sum、assign_sum_to_pixel 这几个函数,且含有 2 层 for 循环。虽然会以损害程序的模块性为代价,但消除函数调用的时间开销,得到的代码运行速度会快得多。所以,需要改写代码,不调用 avg 函数。 3)优化代码1如下:char smooth_descr1 = smooth1: with less func call and grossly simplified calculation for central parts;void smooth1(int dim, pixel *src, pixel *dst) int i, j, ii, jj; pixel_sum sum; pixel current_pixel, cp; for (j = 0; j dim; j+) dstRIDX(0, j, dim) = avg(dim, 0, j, src); dstRIDX(dim-1, j, dim) = avg(dim, dim-1, j, src); for (i = 0; i dim; i+) dstRIDX(i, 0, dim) = avg(dim, i, 0, src); dstRIDX(i, dim-1, dim) = avg(dim, i, dim-1, src); for (i = 1; i dim-1; i+) for (j = 1; j dim-1; j+) sum.red = sum.green = sum.blue = 0; for(ii = max(i-1, 0); ii = min(i+1, dim-1); ii+) for(jj = max(j-1, 0); jj 2; dstRIDX(0,0,dim).blue=(srcRIDX(0,0,dim).blue+srcRIDX(1,0,dim).blue+srcRIDX(0,1,dim).blue+srcRIDX(1,1,dim).blue)2; dstRIDX(0,0,dim).green=(srcRIDX(0,0,dim).green+srcRIDX(1,0,dim).green+srcRIDX(0,1,dim).green+srcRIDX(1,1,dim).green)2; dstRIDX(0,dim-1,dim).red=(srcRIDX(0,dim-1,dim).red+srcRIDX(1,dim-1,dim).red+srcRIDX(0,dim-2,dim).red+srcRIDX(1,dim-2,dim).red)2; dstRIDX(0,dim-1,dim).blue=(srcRIDX(0,dim-1,dim).blue+srcRIDX(1,dim-1,dim).blue+srcRIDX(0,dim-2,dim).blue+srcRIDX(1,dim-2,dim).blue)2; dstRIDX(0,dim-1,dim).green=(srcRIDX(0,dim-1,dim).green+srcRIDX(1,dim-1,dim).green+srcRIDX(0,dim-2,dim).green+srcRIDX(1,dim-2,dim).green)2; dstRIDX(dim-1,0,dim).red=(srcRIDX(dim-1,0,dim).red+srcRIDX(dim-2,0,dim).red+srcRIDX(dim-1,1,dim).red+srcRIDX(dim-2,1,dim).red)2; dstRIDX(dim-1,0,dim).blue=(srcRIDX(dim-1,0,dim).blue+srcRIDX(dim-2,0,dim).blue+srcRIDX(dim-1,1,dim).blue+srcRIDX(dim-2,1,dim).blue)2; dstRIDX(dim-1,0,dim).green=(srcRIDX(dim-1,0,dim).green+srcRIDX(dim-2,0,dim).green+srcRIDX(dim-1,1,dim).green+srcRIDX(dim-2,1,dim).green)2; dstRIDX(dim-1,dim-1,dim).red=(srcRIDX(dim-1,dim-1,dim).red+srcRIDX(dim-1,dim-2,dim).red+srcRIDX(dim-2,dim-1,dim).red+srcRIDX(dim-2,dim-2,dim).red)2; dstRIDX(dim-1,dim-1,dim).blue=(srcRIDX(dim-1,dim-1,dim).blue+srcRIDX(dim-1,dim-2,dim).blue+srcRIDX(dim-2,dim-1,dim).blue+srcRIDX(dim-2,dim-2,dim).blue)2; dstRIDX(dim-1,dim-1,dim).green=(srcRIDX(dim-1,dim-1,dim).green+srcRIDX(dim-1,dim-2,dim).green+srcRIDX(dim-2,dim-1,dim).green+srcRIDX(dim-2,dim-2,dim).green)2; /boarderfor(i=1;idim-1;i+) dstRIDX(i,0,dim).red=(srcRIDX(i,0,dim).red+srcRIDX(i-1,0,dim).red+srcRIDX(i-1,1,dim).red+srcRIDX(i,1,dim).red+srcRIDX(i+1,0,dim).red+srcRIDX(i+1,1,dim).red)/6; dstRIDX(i,0,dim).blue=(srcRIDX(i,0,dim).blue+srcRIDX(i-1,0,dim).blue+srcRIDX(i-1,1,dim).blue+srcRIDX(i,1,dim).blue+srcRIDX(i+1,0,dim).blue+srcRIDX(i+1,1,dim).blue)/6; dstRIDX(i,0,dim).green=(srcRIDX(i,0,dim).green+srcRIDX(i-1,0,dim).green+srcRIDX(i-1,1,dim).green+srcRIDX(i,1,dim).green+srcRIDX(i+1,0,dim).green+srcRIDX(i+1,1,dim).green)/6;for(i=1;idim-1;i+) dstRIDX(i,dim-1,dim).red=(srcRIDX(i,dim-1,dim).red+srcRIDX(i-1,dim-1,dim).red+srcRIDX(i-1,dim-2,dim).red+srcRIDX(i,dim-2,dim).red+srcRIDX(i+1,dim-1,dim).red+srcRIDX(i+1,dim-2,dim).red)/6; dstRIDX(i,dim-1,dim).blue=(srcRIDX(i,dim-1,dim).blue+srcRIDX(i-1,dim-1,dim).blue+srcRIDX(i-1,dim-2,dim).blue+srcRIDX(i,dim-2,dim).blue+srcRIDX(i+1,dim-1,dim).blue+srcRIDX(i+1,dim-2,dim).blue)/6; dstRIDX(i,dim-1,dim).green=(srcRIDX(i,dim-1,dim).green+srcRIDX(i-1,dim-1,dim).green+srcRIDX(i-1,dim-2,dim).green+srcRIDX(i,dim-2,dim).green+srcRIDX(i+1,dim-1,dim).green+srcRIDX(i+1,dim-2,dim).green)/6; for(j=1;jdim-1;j+) dstRIDX(0,j,dim).red=(srcRIDX(0,j,dim).red+srcRIDX(0,j-1,dim).red+srcRIDX(1,j-1,dim).red+srcRIDX(1,j,dim).red+srcRIDX(0,j+1,dim).red+srcRIDX(1,j+1,dim).red)/6; dstRIDX(0,j,dim).blue=(srcRIDX(0,j,dim).blue+srcRIDX(0,j-1,dim).blue+srcRIDX(1,j-1,dim).blue+srcRIDX(1,j,dim).blue+srcRIDX(0,j+1,dim).blue+srcRIDX(1,j+1,dim).blue)/6; dstRIDX(0,j,dim).green=(srcRIDX(0,j,dim).green+srcRIDX(0,j-1,dim).green+srcRIDX(1,j-1,dim).green+srcRIDX(1,j,dim).green+srcRIDX(0,j+1,dim).green+srcRIDX(1,j+1,dim).green)/6; for(j=1;jdim-1;j+) dstRIDX(dim-1,j,dim).red=(srcRIDX(dim-1,j,dim).red+srcRIDX(dim-1,j+1,dim).red+srcRIDX(dim-1,j-1,dim).red+srcRIDX(dim-2,j,dim).red+srcRIDX(dim-2,j+1,dim).red+srcRIDX(dim-2,j-1,dim).red)/6; dstRIDX(dim-1,j,dim).blue=(srcRIDX(dim-1,j,dim).blue+srcRIDX(dim-1,j+1,dim).blue+srcRIDX(dim-1,j-1,dim).blue+srcRIDX(dim-2,j,dim).blue+srcRIDX(dim-2,j+1,dim).blue+srcRIDX(dim-2,j-1,dim).blue)/6; dstRIDX(dim-1,j,dim).green=(srcRIDX(dim-1,j,dim).green+srcRIDX(dim-1,j+1,dim).green+srcRIDX(dim-1,j-1,dim).green+srcRIDX(dim-2,j,dim).green+srcRIDX(dim-2,j+1,dim).green+srcRIDX(dim-2,j-1,dim).green)/6; /common for(i=1;idim-1;i+) for(j=1;jdim-1;j+) dstRIDX(i,j,dim).red=(srcRIDX(i,j,dim).red+srcRIDX(i+1,j,dim).red+srcRIDX(i-1,j,dim).red+srcRIDX(i,j-1,dim).red+srcRIDX(i+1,j-1,dim).red+srcRIDX(i-1,j-1,dim).red+srcRIDX(i,j+1,dim).red+srcRIDX(i+1,j+1,dim).red+srcRIDX(i-1,j+1,dim).red)/9; dstRIDX(i,j,dim).blue=(srcRIDX(i,j,dim).blue+srcRIDX(i+1,j,dim).blue+srcRIDX(i-1,j,dim).blue+srcRIDX(i,j-1,dim).blue+srcRIDX(i+1,j-1,dim).blue+srcRIDX(i-1,j-1,dim).blue+srcRIDX(i,j+1,dim).blue+srcRIDX(i+1,j+1,dim).blue+srcRIDX(i-1,j+1,dim).blue)/9; dstRIDX(i,j,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论