一、实验内容
1、通过改写rotate和smooth函数,对程序进行优化,最后通过查看加速比和cep
得出最终的结果,cep越小越好,加速比越大越好
二、相关知识
程序优化的方法 :
循环展开 代码移位
消除不必要的过程调用
代码剖析程序:测量程序各个部分性能的工具,分析代码中低效的地方。
大多数的编译器都提供优化控制:gcc而言 -o1,-o2,-o3 让编译更全面优化
存储器别名使用:编译器必须考虑假设不同的指针可能指向存储器的同一个位置。
看似相同的过程会产生不同的结果。
编译器:可以采用叫做内联函数替换的方式进行优化
先转换为内联代码 再对这样的代码做整体的优化。
提高并发性,采用多线程的方法运行,乱序执行
二、实验步骤
1、把实验文件perflab.rar传入虚拟机中
这里通过QQ邮箱的方式成功导入,但linux是不支持rar的解压,需要到官网去下载对应
解压工具 推荐博客https://www.cnblogs.com/findumars/p/8244997.html
然后解压 在下图中按提示修改队伍名字,队伍邮箱 继续接下来的实验
在终端运行make clean清除上次编译的文件,
接着运行make对修改过的代码进行编译,
最后运行./driver运行程序
查看终端的mean,mean代表本次实验的分数,越高越好
- 对代码进行优化
下图是不做任何优化的分数
优化1:减少寄存器调用
发现代码中所有的循环部分++都是后置,如i++, j++等
这体现在汇编代码中会多调用一次eax寄存器来储存i和j的运算中间值,
将其修改成后置++ (--也一样处理)
运行分数如下:
很遗憾,只加了0.X分,优化的结果可以忽略不计
说明该实验的循环次数不多,复杂度不在循环上
优化2:内联函数替换(在优化1基础上)
min,max,accumulate_sum等函数被调用多次,且实现简单,可以考虑声明为内联函数
即改写成 inline static int min等形式
没有一点作用,比第一次优化的分数还要低,,,,,。
优化3:代码移位(在优化1,2基础上)
观察到min和max的返回值不变,但却在循环中调用多次,这里的计算没有必要
修改如下所示:
运行分数如下,还是没有变化,我心态炸了