perflab实验日志一

、实验内容

1、通过改写rotate和smooth函数,对程序进行优化,最后通过查看加速比和cep

得出最终的结果,cep越小越好,加速比越大越好

二、相关知识

程序优化的方法 :

循环展开  代码移位

消除不必要的过程调用

代码剖析程序:测量程序各个部分性能的工具,分析代码中低效的地方。

大多数的编译器都提供优化控制:gcc而言 -o1,-o2,-o3 让编译更全面优化

存储器别名使用:编译器必须考虑假设不同的指针可能指向存储器的同一个位置。

看似相同的过程会产生不同的结果。

编译器:可以采用叫做内联函数替换的方式进行优化

先转换为内联代码 再对这样的代码做整体的优化。

提高并发性,采用多线程的方法运行,乱序执行

 

二、实验步骤

1、把实验文件perflab.rar传入虚拟机中

这里通过QQ邮箱的方式成功导入,但linux是不支持rar的解压,需要到官网去下载对应

解压工具 推荐博客https://www.cnblogs.com/findumars/p/8244997.html

 然后解压 在下图中按提示修改队伍名字,队伍邮箱 继续接下来的实验

perflab实验日志一_第1张图片

在终端运行make clean清除上次编译的文件,

接着运行make对修改过的代码进行编译,

最后运行./driver运行程序

查看终端的mean,mean代表本次实验的分数,越高越好

perflab实验日志一_第2张图片

 

  1. 对代码进行优化

下图是不做任何优化的分数

优化1:减少寄存器调用

发现代码中所有的循环部分++都是后置,如i++, j++等

这体现在汇编代码中会多调用一次eax寄存器来储存i和j的运算中间值,

将其修改成后置++ (--也一样处理)

运行分数如下:

很遗憾,只加了0.X分,优化的结果可以忽略不计

说明该实验的循环次数不多,复杂度不在循环上

 

优化2:内联函数替换(在优化1基础上)

min,max,accumulate_sum等函数被调用多次,且实现简单,可以考虑声明为内联函数

 

即改写成 inline static int min等形式

没有一点作用,比第一次优化的分数还要低,,,,,。

优化3:代码移位(在优化1,2基础上)

观察到min和max的返回值不变,但却在循环中调用多次,这里的计算没有必要

修改如下所示:

运行分数如下,还是没有变化,我心态炸了

你可能感兴趣的:(学习,csapp)