Skip to main content

17 面向流水线的指令设计

单指令周期处理器

一个时钟周期内,处理器正好能处理一条指令。时钟周期是固定的,但指令的电路复杂程度是不同的,实际不同指令执行的时间是不同的。只好把时钟周期和执行时间最长的那个指令设成一样。

流水线设计

指令执行过程拆分成取指令、译码、执行三大步骤。更细分一点,执行过程还包含从寄存器或者内存中读取数据,通过 ALU 进行运算,把结果写回到寄存器或者内存中。

  • 不用把时钟周期设置成整条指令执行的时间
  • 每一个阶段的电路在完成对应的任务后,不需要等待整个指令执行完成,可以直接执行下一条指令的对应阶段

三级流水线:把一个指令拆分成 取指令 - 指令译码 - 执行指令 三个部分

五级流水线:把一个指令拆分成 取指令 - 指令译码 - ALU 计算(指令执行)- 内存访问 - 数据写回 五个部分

CPU 的主频提高,不需要确保最复杂的那条指令在时钟周期里面执行完成,只要保证最复杂的流水线级的操作,在一个时钟周期内完成

不能通过流水线减少单条指令执行的时长,但通过同时执行多条指令的不同阶段,提升了 CPU 的吞吐率

超长流水线的性能瓶颈

增加流水线深度,要多写入到流水线寄存器的操作次数,有性能成本。

冒险和分支预测

提升流水线深度

  • 增加功耗,要保持和原来相同的性能需要提升时钟周期。
  • 需要的电路数量变多,使用的晶体管也就变多。
  • 指令之间互相依赖增多。

指令依赖

  1. 数据冒险
  2. 结构冒险
  3. 控制冒险

解决方案:乱序执行、分支预测