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

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

2017-02-22 17:00 375 查看
《深入理解计算机系统》的第5章讲的是优化程序性能,这一章看完了还是有不少收获的,现在简要的总结一下。书中总结了优化程序性能的策略,大致分为以下几类:

1. 高级设计

    为问题选择合适的算法和数据结构。这块很容易理解,选择合适的数据结构,设计算法复杂度低的算法。

2. 基本编码原则

    消除连续的函数引用,消除不必要的存储器引用。

    消除连续的函数引用,这块好理解,每个函数(过程)的调用一方面是会带来栈帧的开销,另一方面函数里面也会有一堆指令需要执行,自然能省则省。

    消除不必要的存储器引用,这块则是要理解读写存储器的速度是比较慢的,远远没有读写寄存器来得快。减少存储器的访存次数,改为使用临时中间变量(寄存器),这种做法自然也是可以提高程序的效率的。

3. 低级优化

    展开循环,降低开销;通过多个累加变量和重新结合的方法,提高指令集并行;重写条件操作,使得编译采用条件传送。

    这些优化思想就很偏底层了,需要结合处理器的指令集体系架构来理解。按照我粗浅的理解,这些优化措施在很大程度上都是想充分利用处理器的流水线机制。现代的处理器基本都使用了流水线机制,那么流水线机制在什么时候性能最好呢?就是各个指令都完全独立的时候,那样流水线就能满负荷的工作了。

    但是实际的情形往往没有这么理想,顺序的指令之间存在数据依赖的情形。拿书中的示例来说,  对于如下的汇编代码:

   


     假设每个指令都有取指、译码、执行、访存、回写这样5个阶段,那么按照流水线的原理。当mulss指令还在执行的时候(乘法耗的时钟周期比较长),很可能此时已经轮到下一个mulss指令来到译码阶段了。那么这里就会出问题了,下一条mulss指令需要访问xmm0寄存器的值,但是此时这个寄存器值还没有更新,是有问题的。所以下一个mulss指令不得不在流水线上继续等着,这就造成浪费了。 

    那么如何优化呢?一个容易想到的思路就是对算法做并行化处理,假设我是要求a1*a2*...*an,那么a1*a2跟a3*a4不冲突啊,可以并行的去执行啊。如果能让alu在算a1*a2的时候,让流水线去完成a3*a4的取值 译码,这样不就可以提高流水线的效率了!这就是算法的优化思路。

   至于条件传送,那也是想提高流水线的处理效率。条件分支明显是跟流水线的思想有所冲突的:在遇到分支的时候,处理器常常会执行分支预测,但是一旦预测错了就会有惩罚。条件传送的思想是让处理器同时执行两个分支的内容,然后再选择传送哪个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: