全部博文(436)
分类: LINUX
2012-11-25 19:20:31
本章介绍了从消除循环的低效率,减少过程调用,消除不必要的存储器引用,降低循环开销,提高并行性等方面来优化程序性能。
编写高效程序:1.最好的算法和数据结构
2.编写出编译器能够有效优化以转换成高效可执行代码的源代码
编译器的编译技术:与机器有关(不考虑将要执行代码的计算机的特性)
与机器无关(这些技术依赖于许多机器的低级细节)
妨碍优化的因素:程序行为中那些严重依赖于执行环境的方面。
代码剖析程序:测量程序各个部分性能的工具。帮助找到代码中低效率的地方,并确定程序
中应该着重优化的部分。
观察结论(Amdahl定律):量化了对系统某个部分进行优化所带来的整体效果。(即当我们 加快系统一个部分的速度时, 对系统整体性能的影响依赖于这个部分有多重要和 速度提高了多少)
降低性能的属性:过多的存储器引用
对寄存器不正确的使用
优化编译器的能力所受限制的因素:
绝不能改变正确的程序行为
对程序行为及对使用给它们的环境了解有限
需要很快得完成编译工作
每元素的周期数(CPE)(对程序的度量标准):帮助在更详细的级别上理解迭代程序的循环性能,对执
行重复计算的程序来说很适当(例如像素,计算矩阵乘积中的元素)
CPE=直线的斜率(直线方程由最小二乘方拟合得到)
CPE:表示程序的性能,指导改进代码。
消除循环的低效率:将每次循环中执行多次但计算结果不改变的部分提出循环,这样只需计
算一次,而不用循环一次,计算一次。以此提高算法效率。
消除不必要的存储器引用:即5.1中twiddle1和twiddle2的实例。
理解现代处理器
现代微处理器: ICU 指令控制单元
EU 执行单元
ICU:负责从存储器中读出指令序列,并根据这些指令序列生成一组针对程序数据的基 本操作。
EU:执行ICU生成的操作,并指出分支预测是否正确。
分支:即条件转移指令(在满足一定条件时相对转移,例如JC,JS等)。对处理器来说, 即其他可能将控制传送到多个目的地址的指令(例如:过程返回和间接跳转)
当程序遇到分支时,程序有两种可能的前进方向,一种可能会选择分支,控制被传递到分支目标,另一种可能是不选择分支,控制被传递到指令序列的下一条指令。
分支预测技术:处理器会预测是否选择分支,同时还预测分支的目标地址。
流水线化:意味着在前一个操作完成之前,就可以开始一个新的操作。
处理器的每个操作都是由以下两个周期计数值来刻画:
执行时间:指明功能单元完成操作所需的总周期数。
发射时间:指明一个单元的连续操作之间的周期数。
处理器性能受三类约束限制:
1.程序中的数据相关性迫使一些操作延迟知道它们的操作数被计算出来
2.资源约束限制了在任意给定时刻能够执行多少个操作
3.分支预测逻辑的成功限制了处理器能够在指令流中超前工作以保持执行单元繁忙的程度。
提高并行性
循环分割,利用功能单元的流水线化的能力提高代码性能。对于一个可结合和可交换的合并操作来说,比如说整数加法和乘法,我们可以通过将一组合并操作分割成两个或更多的部分,通过在最后合并结果来提高性能。
未解决的问题:
在何种情况下,转换为指针代码比数组代码调高程序性能?
并行的限制
有无资源的操作调度和资源约束下的操作调度
为什么会有存储器的别名使用现象?