湖南大学计组实验lab4 perflab

上传人:n**** 文档编号:88909132 上传时间:2019-05-13 格式:PDF 页数:13 大小:502.52KB
返回 下载 相关 举报
湖南大学计组实验lab4 perflab_第1页
第1页 / 共13页
湖南大学计组实验lab4 perflab_第2页
第2页 / 共13页
湖南大学计组实验lab4 perflab_第3页
第3页 / 共13页
湖南大学计组实验lab4 perflab_第4页
第4页 / 共13页
湖南大学计组实验lab4 perflab_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《湖南大学计组实验lab4 perflab》由会员分享,可在线阅读,更多相关《湖南大学计组实验lab4 perflab(13页珍藏版)》请在金锄头文库上搜索。

1、 课程实验报告 课 程 名 称: 计算机组成与结构 实验项目名称: perflab 专 业 班 级: 姓 名: 学 号: 指 导 教 师: 完 成 时 间: 2016 年 5 月 24 日 信息科学与工程学院 实验题目:perflab 实验目的:本次实验,要求针对每个函数、每个人均至少写出 3 种优化版本、并根据 driver 报告的结果进行性能分析。 实验环境:ubuntu14.04 虚拟机 实验内容及操作步骤: 一、 rotate 函数优化: 原函数: 考虑函数的作用, 我在第六次小班讨论课上作了分析, 所以就引用当时 ppt 里的内容来分析函 数功能: Pixel 是什么?RIDX 是什

2、么? -寻找头文件 defs.h(意为:解释,解说) 下面考虑 na ve_rotate(5,src,dst) i=0 j=0 dst20=src0 i=1 j=0 dst21=src5 i=0 j=1 dst15=src1 i=1 j=1 dst16=src6 i=0 j=2 dst10=src2 i=1 j=2 dst11=src7 i=0 j=3 dst5=src3 i=1 j=3 dst6=src8 i=0 j=4 dst0=src4 i=1 j=4 dst1=src9 作图分析如下: 很容易看出来,这个 rotate 函数是对一个 dim*dim 大小的方块作逆时针旋转 90 度的操

3、作,在 这个函数里,每一次操作都是一个单独的“读 source”“写到 destination”,的操作,而由于对读 source 的操作是步长为 1 的按行读取,因而 cache 命中率较高,而对于写到 destination 中的操作是 步长为 dim 的按列读取,因而 cache 命中率较低,从这个角度考虑,可以交换内外循环的次序进行 优化,优先考虑写的操作。 另一方面,从循环的角度考虑,可以进行循环展开和循环分块操作,循环展开是对于一个循 环体,将循环内部的操作展开,牺牲程序的尺寸来执行速度优化。 对于循环分块,这里的分块指的是一个应用级的数据组块,而不是高速缓存中的块,这样构 造程序

4、,能将一个片加载到 L1 高速缓存中去,并在这个片中进行所需要的所有读和写,然后丢掉 这个片,加载下一个片,以此类推。 对于循环分块, 有另外的一些需要考虑的地方, 即是分块的大小, 这里考虑和两方面有关: (1) 要比 cache 小,避免容量不命中的情况, (2)是要做到能被测试 dim 整除,我一开始试的是 5*5 的循环分块,就因为不能被整除而导致无法得到正确结果。 接下来是我的三个优化示例: (1)循环分块,大小 4*4,不作循环展开 代码如下: void rotate(int dim, pixel *src, pixel*dst) int i,j,i1,j1; for(i1=0;i

5、1 b ? a : b) charsmooth_descr = “smooth: Current working version“; void smooth(int dim, pixel *src, pixel *dst) int i, j; for (i = 0; i 2; dst0.blue = (src0.blue+src1.blue+srcdim.blue+srcdim+1.blue)2; dst0.green = (src0.green+src1.green+srcdim.green+srcdim+1.green)2; dstdim-1.red = (srcdim-1.red+src

6、dim-2.red+srcdim*2-1.red+srcdim*2-2.red)2; dstdim-1.blue = (srcdim-1.blue+srcdim-2.blue+srcdim*2-1.blue+srcdim*2-2.blue)2; dstdim-1.green = (srcdim-1.green+srcdim-2.green+srcdim*2-1.green+srcdim*2-2.green)2; dstdim*(dim-1).red = (srcdim*(dim-1).red+srcdim*(dim-1)+1.red+srcdim*(dim-2).red+srcdim*(dim

7、-2)+1.red)2; dstdim*(dim-1).blue = (srcdim*(dim-1).blue+srcdim*(dim-1)+1.blue+srcdim*(dim-2).blue+srcdim*(dim-2)+1.blue)2; dstdim*(dim-1).green = (srcdim*(dim-1).green+srcdim*(dim-1)+1.green+srcdim*(dim-2).green+srcdim*(dim-2)+1.green) 2; dstdim*dim-1.red = (srcdim*dim-1.red+srcdim*dim-2.red+srcdim*

8、(dim-1)-1.red+srcdim*(dim-1)-2.red)2; dstdim*dim-1.blue = (srcdim*dim-1.blue+srcdim*dim-2.blue+srcdim*(dim-1)-1.blue+srcdim*(dim-1)-2.blue)2; dstdim*dim-1.green = (srcdim*dim-1.green+srcdim*dim-2.green+srcdim*(dim-1)-1.green+srcdim*(dim-1)-2.green)2; /边处理 for (j = 1; j dim-1; j+) dstj.red = (srcj.re

9、d+srcj-1.red+srcj+1.red+srcj+dim.red+srcj+1+dim.red+srcj-1+dim.red)/6; dstj.green = (srcj.green+srcj-1.green+srcj+1.green+srcj+dim.green+srcj+1+dim.green+srcj-1+dim.green)/6; dstj.blue = (srcj.blue+srcj-1.blue+srcj+1.blue+srcj+dim.blue+srcj+1+dim.blue+srcj-1+dim.blue)/6; for (j = dim*(dim-1)+1; j di

10、m*dim-1; j+) dstj.red = (srcj.red+srcj-1.red+srcj+1.red+srcj-dim.red+srcj+1-dim.red+srcj-1-dim.red)/6; dstj.green = (srcj.green+srcj-1.green+srcj+1.green+srcj-dim.green+srcj+1-dim.green+srcj-1-dim.green)/6; dstj.blue = (srcj.blue+srcj-1.blue+srcj+1.blue+srcj-dim.blue+srcj+1-dim.blue+srcj-1-dim.blue)

11、/6; for (j = dim; j dim*(dim-1); j+=dim) dstj.red = (srcj.red+srcj-dim.red+srcj+1.red+srcj+dim.red+srcj+1+dim.red+srcj-dim+1.red)/6; dstj.green = (srcj.green+srcj-dim.green+srcj+1.green+srcj+dim.green+srcj+1+dim.green+srcj-dim+1.green) /6; dstj.blue = (srcj.blue+srcj-dim.blue+srcj+1.blue+srcj+dim.bl

12、ue+srcj+1+dim.blue+srcj-dim+1.blue)/6; for (j = dim+dim-1; j dim*dim-1; j+=dim) dstj.red = (srcj.red+srcj-1.red+srcj-dim.red+srcj+dim.red+srcj-dim-1.red+srcj-1+dim.red)/6; dstj.green = (srcj.green+srcj-1.green+srcj-dim.green+srcj+dim.green+srcj-dim-1.green+srcj-1+dim.green)/6 ; dstj.blue = (srcj.blu

13、e+srcj-1.blue+srcj-dim.blue+srcj+dim.blue+srcj-dim-1.blue+srcj-1+dim.blue)/6; /内部处理 for (i = 1; i dim-1; i+) for (j = 1; j dim-1; j+) rij = rindex+j; dstrij.red = (srcrij.red+srcrij-1.red+srcrij+1.red+srcrij-dim.red+srcrij-dim-1.red+srcrij-dim+1.red+srcrij+d im.red+srcrij+dim+1.red+srcrij+dim-1.red)

14、/9; dstrij.green = (srcrij.green+srcrij-1.green+srcrij+1.green+srcrij-dim.green+srcrij-dim-1.green+srcrij-dim+1.g reen+srcrij+dim.green+srcrij+dim+1.green+srcrij+dim-1.green)/9; dstrij.blue = (srcrij.blue+srcrij-1.blue+srcrij+1.blue+srcrij-dim.blue+srcrij-dim-1.blue+srcrij-dim+1.blue+sr crij+dim.blu

15、e+srcrij+dim+1.blue+srcrij+dim-1.blue)/9; rindex += dim; 写了很长的代码,优化了三倍的速度,然而感觉这种优化没什么用,不可能每次写代码都为 了速度更快把代码展开成几百行的可读性很差的代码,这也是我对这个实验兴趣很低的原因。 (3)通过上面一个例子可以看到,是不是可以通过对 dim-case 进行讨论,把测试图像中的每 个点单独用公式算出来,如果可以的话,这个速度会变快吗? 这个代码我没有自己去写,而是去网上找了一个大神写的,有 800 多行,而且可读性非常差, 所以只做了一个思路上的参考。然后我试着在自己的 ubuntu 机器上跑了一下那个代码,也没有跑 出结果,反而差点死机。 后来我看了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号