什么是指令管道?

任何处理器指令的操作都有多个阶段。 这些阶段中的每一个都需要一个 CPU 周期才能完成。 这些阶段是指令获取、指令解码、执行、内存访问和写回。 它们分别获取需要完成的指令,将操作与被操作的值分离,执行过程,打开将要写入结果的寄存器,并将结果写入打开的寄存器。

历史顺序处理器

在早期的计算机中,CPU 不使用指令流水线。 在这些 CPU 中,每条指令都需要执行每个单周期操作。 这意味着在开始下一条指令之前,平均需要五个时钟周期才能完全处理完一条指令。 某些操作可能不需要将任何结果写入寄存器,这意味着可以跳过内存访问和回写阶段。

在没有流水线的子标量处理器中,每条指令的每个部分都按顺序执行。

但是,在能够继续执行下一条指令之前按顺序运行完整指令时,潜伏着一个问题。 问题是缓存未命中。 CPU 将正在处理的数据存储在寄存器中。 这可以通过一个周期的延迟来访问。 问题是寄存器很小,因为它内置在处理器内核中。 如果数据尚未加载,CPU 必须转到更大但速度较慢的 L1 缓存。 如果它不存在,它必须再次进入更大更慢的 L2 缓存。 下一步是L3缓存; 最后一个选项是系统 RAM。 这些选项中的每一个都需要越来越多的 CPU 周期来检查。

现在,在开始下一条指令之前必须按顺序完整完成每条指令的系统中,这种额外增加的延迟可能是一个大问题。 每条指令处理器需要 5 个周期,现在可能会突然在一条指令上挂起数十或数百个时钟周期。 一直以来,计算机上都不会发生任何其他事情。 从技术上讲,这可以通过拥有两个独立的内核来缓解。 然而,没有什么能阻止他们俩做同样的事情,可能同时做。 所以走多核路线并不能解决这个问题。

经典的 RISC 流水线

RISC代表精简指令集计算机. 这是一种处理器设计风格,通过简化每条指令的解码来优化性能。 这与 CISC 或复杂指令集计算机相比,后者设计了更复杂的指令集,允许执行相同任务所需的指令更少。

经典的 RISC 设计包括一条指令流水线。 与在任何给定周期中运行五个指令阶段中的任何一个不同,流水线允许执行所有五个阶段。 当然,您不能在一个周期内运行一条指令的所有五个阶段。 但是您可以排队五个连续的指令,每个指令偏移一个阶段。 这样,每个时钟周期都可以完成一条新指令。 在核心复杂性相对较低的情况下提供潜在的 5 倍性能提升。

在标量流水线处理器中,指令执行的每个阶段可以在每个时钟周期执行一次。 这允许每个周期完成一条指令的最大吞吐量。

没有流水线的处理器只能是子标量,因为它们不能在每个周期执行一条完整的指令。 使用这个主要的五级流水线,您可以制作一个可以为每个进程完成一条指令的标量 CPU。 通过创建更深远的管道,您可以制造每个时钟周期可以执行多条指令的超标量 CPU。 当然,仍然存在潜在的问题。

仍然顺序

当需要查询不同级别的缓存和 RAM 时,这些都不能解决等待多个周期响应的问题。 它还引入了一个新问题。 如果一条指令依赖于前一条指令的输出怎么办? 这些问题由高级调度程序独立解决。 它仔细计划了执行顺序,这样就没有依赖于另一个输出的指令太 close 一起。 它还通过停放一条指令并将其在管道中替换为其他准备好运行且不需要其结果的指令来处理缓存未命中,并在准备好时恢复该指令。

这些解决方案可以在非流水线处理器上工作,但它们是每个时钟运行多条指令的超标量处理器所必需的。 分支预测器也非常有用,因为它可以尝试预测具有多个潜在结果的指令的结果,并继续假设它是正确的,除非另有证明。

结论

流水线允许在每个周期中使用处理器的所有独特功能。 它通过同时运行不同指令的不同阶段来做到这一点。 这甚至不会给 CPU 设计增加太多复杂性。 它还为每个周期允许多条指令执行单个阶段铺平了道路。