全部博文(436)
分类: LINUX
2012-11-26 09:44:26
第五章 优化程序性能
本章主要介绍了怎样优化程序性能:消除循环低效率,减少过程调用,降低循环开销,提高并行性等。
1、编译器的编译技术:与机器有关(不考虑将要执行代码的计算机的特性)
与机器无关(依赖于许多机器的低级细节)
2、编译器优化程序的能力受几个因素限制:要求它们不能改变正确的程序行为;它们对程序的行为、对使用它们的环境了解有限;需要很快的完成编译工作。
3、妨碍优化的因素:程序行为中那些严重依赖于执行环境的方面。编译器有时不能使用某些类型的优化,如存储器别名使用的现象(编译器必须假设不同的指针可能会指向存储器中的同一个位置);函数调用(改变调用次数会改变程序的行为)。
4、每元素的周期数(CPE):程序性能的度量标准(即图示中的斜率)。帮助我们在更详细的级别上理解迭代程序的循环性能,适合执行重复计算的程序,如处理图像中的像素;计算矩阵乘积中的元素。在元素值较大的情况下,CPE越小,程序的性能越好。
注:迭代值执行一遍组成的循环语句块。
5、代码移动:识别出要执行多次,但是计算结果不会改变的计算,因而我们可以将计算机移动到代码前面的,不会被多次求值的部分。大多情况我们需要显式地完成代码的移动,可消除循环的低效率。
6、减少过程调用:过程调用会带来相当大的开销,而且妨碍大多数形式的程序优化,因此一般会尽量减少过程调用,同时对于性能至关重要的程序来说,为了速度,经常必须要损害一些模块性和抽象性。
7、消除不必要的储存器引用:若循环要不停的赋值给某指针,我们可以引用一个临时变量,用在循环中存放计算出来的值,在循环后再存放结果,可显著改善程序性能。
8、超标量(P6):可以在每个时钟周期执行多个操作,而且是乱序的,即执行指令的顺序可以与汇编程序顺序不一致。
9、现代微处理器整个设计的两个主要部分:
ICU(指令控制单元):负责从存储器中读出指令序列,并根据这些指令序列生成一组针对程序数据的基本操作。
EU(执行单元):负责执行ICU生成的操作,并指出分支预测是否正确。
注:分支专指条件转移指令,其他可能将控制传送到多个目的地址的指令,如过程返回和间接跳转。
10、分支预测技术:处理器会预测是否选择分支,同时还预测分支的目标地址。
11、投机执行:在确定分支预测结果是否正确前,取出处理器预测的分支处的指令并对指令解码,若预测错误,则重新设置到分支点状态,取出和执行另一方向的指令。但此方法的成本效率还没被认可。
12、退役单元:退役单元记录正在进行的处理,并确保它遵守机器级程序的顺序语义。指令解码时,关于指令的信息被放置在一个先进先出的队列中,这个信息会一直保持在队列中,直到两个结果中的一个发生。首先,一旦指令的操作完成了,而多有导致这条指令的分支点也都被确认为预测正确,那么这条指令就可以退役了。如果导致该指令的某个分支点预测错误,这条指令会被清空。
13、处理器的计时特征:
处理器的每个操作都是由以下两个周期计数值来刻画:
执行时间:指明功能单元完成操作所需的总周期数。
发射时间:指明连续的、独立操作之间的周期数。
14、流水线化:意味着在前一个操作完成之前,就可以开始一个新的操作。大多数单元能够每个时钟周期开始一个新操作,仅有的例外是浮点乘法器(至少两周期)和两个除法器(没有流水线化)。
15、有无限资源的操作调度:假设一个处理器有无限多个功能单元和完美的分支预测,此时处理器性能就只受功能单元的执行时间和吞吐量,以及程序中的数据相关性限制。
16、资源束缚下的操作调度:功能单元的数目固定,处理器受资源约束的限制,因此处理器必须要有调度策略,程序顺序也就是我们按照严格的顺序来执行机器级程序。
17、处理器性能受三类约束限制:
第一,程序中的数据相关性迫使一些操作延迟知道它们的操作数被计算出来。
第二,资源约束限制了在任意给定时刻能够执行多少个操作。
第三,分支预测逻辑的成功限制了处理器能够在指令流中超前工作以保持执行单元繁忙的程度。
18、循环展开:在一次迭代中访问数组元素并做乘法,减少了迭代次数,降低了循环开销。
19、循环分割:对于一个可结合和可交换的合并操作来说,比如说整数加法和乘法,我们可以通过将一组合并操作分割成两个或更多的部分,通过在最后合并结果来提高性能。Pn=PEn(索引值为偶数的元素的乘积)*POn(索引值为奇数的元素的乘积)。
20、浮点性能异常:在一个IA32处理器上,所有的浮点操作都是以扩展的80位精度执行的,而浮点寄存器也是按照这个格式存储值的。只有当寄存器中的值写入存储器中时,才把它转换成32位或64位格式。
21、性能提高技术:
高级设计:选择适当的算法和数据结构。
基本编码原则:消除连续的函数调用,消除不必要的存储器引用,避免限制优化因素。
低级优化:尝试各种与数组代码相对的指针形式;通过展开循环降低循环开销;通过迭代分割之类的技术找到使用流水线化的功能单元的方法。
22、代码剖析程序:测量程序各个部分性能的工具。帮助找到代码中低效率的地方,并确定程序中应该着重优化的部分。Unix系统提供了一个剖析程序GPROF。
23、GPROF的属性:计时不是很准确;调用信息相当可靠;默认情况下,不会显示对库函数的调用。
24、Amdahl定律:主要思想是当我们加快系统一个部分的速度时,对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少。
未解决的问题:
1、CPE的有效数和CPE有什么区别?
2、最小二乘方拟合算出的最小误差度量是CPE吗?
3、习题5.2中版本2的n取值答案是否有误?
4、命令行开关设置是怎样运行的?即使执行循环展开也不一定达到最优化,因此优化选项到底以什么为标准?
5、习题5.5
6、发射时间计算的实际应用
7、预测错误处罚的时钟周期是怎么算的?
8、图5.33示例A
本周我学习了第五章优化程序性能的全部内容,并做了相应练习,还发现了不少问题,希望本周与大家讨论,解决以上问题。