深入理解计算机系统 perflab 程序性能优化实验

来源:互联网 发布:头颅移植 知乎 编辑:程序博客网 时间:2024/05/22 13:16

自从上次实验3bomb已经过去很久了,昨天周六下午刚刚验收完所带班级的必做实验的最后两个,最近一直很忙,也没有来更新了,其实不是最近应该是每天都好忙,最近一直还在看论文做实验。

验收前周五拿出时间来看了一下最后两个必做实验。一个是perflab,性能实验,这个实验主要是考察的课本中的第五章的程序优化的一些知识,通过优化程序的核函数,然后来对比自己和原始函数的CPE和加速比。

这个实验主要考虑一些优化措施,里面有两个函数,一个rotate函数,rotate函数是将图像实现逆时针旋转90°,针对这个函数的优化,


1交换内外循环的次序,优先考虑写操作

2循环展开

3循环分块,这个最有效的优化,主要是可以查看提供的函数头里面关于cache的大小,根据cache的大小来设置块的大小,做到cache友好性,提高命中率。开始很多同学只是懂把循环分块了,但是不懂为什么不是块越大越好,因为如果比cache大了,超出的部分又不命中了。


第二个函数是smooth函数,用来实现类似于求图片中每个元素所在的九宫格的平均值,然后将该值放到该元素中。

 



这里最大函数缺陷就是每次都去重复的读取元素。

首先看到smooth函数在两层for循环中还去调用一个avg函数,就要去看看avg函数做一些优化。

看到avg函数中也有两层for循环,而且for循环中的条件赋值语句不是一个值而是一个min和max的函数调用,果断提到for外边先求出值,保存为临时变量,减少每次的调用计算次数。也就是尽量减少函数调用,另外同理将调用宏函数RIDX的计算结果也存储起来,减少计算和调用的次数。

但是这些做完的实验结果不是非常明显的优化。

主要是smooth中有两层for循环,而调用的avg函数中也是两层for循环,而且原函数每次都是去扫描,所以重复读取很多以前已经读取过的元素了,最好的优化就是不去调用原函数的avg而是自己实现一个avg,分情况逐一实现求取平均值,考虑边角元素,边上元素,以及中间元素等几种情况分别来实现。这样的优化带来很大的提高,但是函数变的非常冗长而且可读性非常差,用低可读性的代价来换来程序的优化性能。

这个实验就是这样,主要考察一些程序性能优化的方法,减少过程调用,消除不必要的寄存器引用,循环展开,分块cache友好性等。


0 0
原创粉丝点击