CPU架构学习心得(一)

来源:互联网 发布:自己淘宝店铺的链接 编辑:程序博客网 时间:2024/05/13 05:58

CPU从产生之初就追求更快的速度,那么提高CPU速度的方法到底有哪些?下面就从简单到复杂大致的记录下最近的一些学习心得:

  1. 流水线技术。把指令细分作更小的部分,又不同的功能部件来完成。假设每条指令都可以分作4步:取指,译码,执行,写回。这4步分别由不同的功能部件来完成,流水线技术带来的好处就是:取指部件在做完指令1的取指之后,可以立即开始指令2的取指,而不需要等待指令1的“写回”完成。从单条指令的执行时间来看并没有减少,但针对整个程序而言,CPU可以在每个周期执行完一条指令,相比于不采取流水线技术时4个周期才能完成一条指令,速度提高了4倍。即流水线中分作N个部分,理论上整体速度能提高N倍,但在实际应用中是不可能做到的:首先,指令不可能无限划分为更小的部分;其次,指令之间可能相互依赖,可能需要等待;再次,指令流并不是顺序执行的,中间可能有条件转移和跳转指令。
  2. 循环展开。这个技术是如何提高CPU的指令处理速度的呢?主要是从两个方面:第一,循环展开之后,原有的条件转移指令次数会减少,从而性能会提高;第二,循环展开之后,动态调度可以在更大范围内进行。其实在tomasulo方法中,动态调度是能够处理转移指令的。
  3. 分支预测。主要是针对指令流中的条件跳转指令。CPU遇到条件转移指令时,在转移所依赖的结果还未计算出来时,无法知道接下来的指令在哪里。那么,有一种方法就是猜测。等到转移所依赖的结果计算出来时,就能知道猜测是否正确,如果正确,就节省了时间,如果错误,当然需要把之前已经执行的指令及其产生的状态全部清掉。这里,就是希望猜测的准确率提高。如何做到?在CPU设计时可以增加一个bit用来记录之前条件转移是否发生,如果发生,该bit为1,否则为0.第二次进行条件转移时,则依赖这个bit来猜测,如果为1,则假设转移会发生,就按照转移发生的指令流继续执行,否则按照转移不发生的指令流执行。当然,还可以有更复杂的实现机制,从而有更高的猜测准确率,但同时硬件设计也更为复杂,需要在这中间找到一个平衡点。
  4. 动态调度。在指令执行时,不同的阶段(取指、译码、执行、写回)需要的时间不一样,从而该条指令可能会处于等待状态,这时它之后的指令说不定已经满足执行条件了,在支持动态调度的情况下,可以把后面满足执行条件的指令提前执行,而不需要等待当前的指令执行结束。在这个技术里面,需要通过硬件去检测指令之间的冲突,名字冲突可以通过寄存器重命名解决,地址冲突则需要通过load/store缓冲区来解决,如果指令之间确实有依赖关系,则无法进行动态调度。
  5. 多发射和静态调度(VLIW)。多发射是针对CPU中有多条流水线的情况,在有多条流水线时,可以一次发射多条指令到不同的流水线中去分别执行。VLIW也是通过这样的方式去利用CPU中的多条流水线。多发射技术实际上应用在下面三种情况下:静态调度的超向量机(所谓的超向量机,也就是指有多条流水线),VLIW架构的处理器,动态调度的超向量机。静态调度的超向量机和VLIW都依赖编译器在编译阶段就安排好指令的调度,所不同之处在于,静态调度的超向量机可能发射一条指令,也可能发射多条指令,是不固定的;而VLIW在编译阶段就会统一的把指令压成长指令,或者是instruction packet。
  6. 提高取指带宽。
原创粉丝点击