Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

指令流水线技术

复习

  • CPU 执行一条指令要经过取指、译码、执行和写回
  • 不同阶段会使用不同部件
  • 极简 CPU 已经能正确运行程序

本章讨论如何把机器做快。跳过它,不影响后面连接外部设备。

TL;DR

  • 流水线让多条指令同时处于不同阶段
  • 它提高单位时间完成的指令数,却不会缩短单条指令的全部路程
  • 依赖与跳转会让流水线等待或清空

正文

  洗一件衣服要洗、烘、叠三步。若第一件全部完成才开始第二件,洗衣机烘干时,负责洗的设备就在闲着。

  CPU 也一样。一条指令执行时,取指部件、译码部件和 ALU 不会始终同时忙。于是可以让下一条指令提前进入空下来的阶段:

指令 1:取指  译码  执行  写回
指令 2:      取指  译码  执行  写回
指令 3:            取指  译码  执行  写回

  流水线装满后,理想情况下每一拍都能完成一条指令。单条指令仍要走完所有阶段,变快的是整批指令的吞吐量。

后一条等着前一条

  若指令 2 立刻要用指令 1 尚未写回的结果,它就不能放心执行。这叫数据冒险。CPU 可以把刚算出的结果直接转给下一阶段,也可以停一拍等待。

  若遇到跳转,取指部件还不知道下一条该从哪里取,这叫控制冒险。CPU 可以先猜一条路;猜错后,把错误取进来的指令清掉,回到正确地址。

  现实流水线还有更多细节,但主意只有一个:让本来闲着的部件同时工作。 代价是安排并行比排队更复杂。

  至此,CPU 内部已经完成。接下来把视线移到盒子外面:CPU、存储器和外设之间,不能每两块都单独拉满一套线。

思考题

  一条指令分为 4 个阶段。理想流水下,执行 100 条指令大约需要多少拍?为什么不是 25 拍?

小结

知识点

  • 流水线让不同指令的不同阶段重叠
  • 流水线提高吞吐量
  • 数据依赖和跳转会造成冒险

思考题答案(仅供参考)

  大约需要 4 + 99 = 103 拍:第一条走完 4 个阶段,此后理想情况下每拍再完成一条。不是 25 拍,因为每个阶段每拍通常只能接纳一条指令,不能在一拍里完成 4 条完整指令。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪