您的位置:首页 > 理论基础

优化程序性能—《深入理解计算机系统》

2015-10-16 20:41 337 查看

第一部分:基本策略

1)高级设计:适当的算法和数据结构

2)基本编码原则:使编译器产生高效的代码,理解 编译器 的能力和局限性,消除不必要的内容

·消除连续的函数调用

·消除不必要的存储器引用,要考虑是否为 同一地址

以上两点,也是妨碍编译器优化的主要因素,编译器很难判断以进行优化。

3)低级优化:将一个任务分成多个部分,利用多核和多处理器的并行计算;了解计算机的时序特性,为实现指令集并行,降低不同部分之间的数据相关;利用图形数据流和确认关键路径来确定一个循环需要的时间下界

·循环展开,代码移动(将循环中不会变的计算部分,移到循环外边,如 for(int i=0;i<strlen(s);i++)中的strlen)

·多个累计变量和重新结合(如数据结合,整形编译器可以自动重新结合,浮点数因为精度的原因,不会)等

·用功能的风格重写条件操作,用条件传递代替条件控制,减小 预测惩罚

第二部分:定义与工具

1)表示程序性能:每元素的周期数(Cycles Per Element,CPE),越小越好,线性运行时间时,即为线性变量n的系数。

延迟界限(latency bound):当一系列操作必须按照严格顺序执行时

吞吐量界限(throughput bound):处理器功能单元的原始计算能力

2)现代处理器包括:指令控制单元(instruction control unit,ICU) (取址和译码 控制、退役单元(记录正在进行的处理,确保他遵守机器级程序的顺序语义))、执行单元(execution unit,EU)(功能单元和高速缓存的控制)。

数据流图:循环寄存器之间的操作链 决定了限制性能的数据相关。

3)一些限制因素:寄存器溢出(寄存器不够用)、预测错误处罚

4)理解存储器性能:加载(在链表遍历中成为关键瓶颈) 与 存储,必须注意 写/读相关。

5)代码剖析程序

unix>gcc -o1 -pg prog.c -o prog

unix> ./prog file.txt

unix> gprof prog

6)Amdahl 定律

S=Told / Tnew = 1/( (1-a)+a/k ),a 为系统某部分需要时间的百分比,将他的性能提高了k倍。

文中有很多 例子的代码和数据流图,很不错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: