




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: perflab-handout 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 杨科华 完 成 时 间: 2016 年 5 月 27 日信息科学与工程学院实验题目:perflab程序性能调优实验目的:理解编译器,学习程序优化,从优化程序代码和程序执行速度两方面着手。实验要求:本次实验,要求针对每个函数、每个人均至少写出3种优化版本、并根据driver报告的结果进行性能分析实验环境: ubuntu-15.10、 x32系统 、VMware workstation实验内容及操作步骤:将下载下来的 kernels.c 中的 r
2、otate、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
3、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
4、 = 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 友好性来分析,这个代码的效率机会很低,
5、所以按照 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(di
6、m-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
7、+) 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
8、=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
9、+;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; *d
10、st=*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+;
11、 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, sr
12、c);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
13、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,
14、 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(
15、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(
16、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
17、-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,d
18、im).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,
19、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+srcRI
20、DX(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).gre
21、en+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)
22、.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,di
23、m-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,d
24、im).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+s
25、rcRIDX(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
26、,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+srcRI
27、DX(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,
28、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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年辽宁省中考语文试卷(含答案与解析)
- 2025年高考江苏物理试题+答案
- 香雪作业题目及答案
- 草坪学考试题及答案mooc
- 现代史题目及答案解析
- 葡萄培训知识文案简短课件
- 2025年艾灸知识考试试题及答案
- 萨摩耶宠物知识培训班课件
- 2025钢筋买卖合同范本
- 2024译林版八年级英语上册Unit 1 单元测试卷及答案(含三套题)
- 公司对公司走账合同范本
- 核电站主要材料质量保证措施
- (2025年标准)挖桩孔协议书
- 2025-2026学年北师大版(2024)初中生物七年级上册教学计划及进度表
- 浪浪山携志奔赴新学期-2025年秋季开学第一课主题教育班会-2025-2026学年初中主题班会
- 消化内科课件模板
- 2025版集团内部无息借款资金调度与管理合同范本
- 拍摄与剪辑基础知识培训课件
- 2025年时事政治考试100题(附答案)
- 剑桥商务英语BEC(初级)全套课件
- (完整版)保险考试题库(责任险)
评论
0/150
提交评论