【问题标题】:How many clock cycles do the stages of a simple 5 stage processor take?一个简单的 5 级处理器的级需要多少个时钟周期?
【发布时间】:2021-05-09 09:32:27
【问题描述】:

5 级流水线 CPU 具有以下阶段序列:

  • IF – 从指令存储器中取出指令。

  • RD - 指令解码和寄存器读取。

  • EX - 执行:用于数据和地址计算的 ALU 操作。

  • MA – 数据存储器访问 – 对于写访问,在 RD 状态下读取的寄存器是 用过。

  • WB – 寄存器回写。

现在我知道,例如,从内存中提取指令可能需要 4 个周期(L1 高速缓存)或最多 ~150 个周期(RAM)。但是,在每个流水线图中,我看到类似this 的内容,其中每个阶段都分配了一个周期。

现在,我当然知道真正的处理器具有超过 19 个阶段的复杂流水线,并且每种架构都不同。但是,我在这里错过了什么吗?在 IF 和 MA 中进行内存访问,这 5 级流水线是否需要数十个周期?

【问题讨论】:

  • 如果您阅读该图的维基百科文章,您会看到处理器在执行内存访问操作时停止。如果可能,更高级的 CPU 设计将重新排序操作或使用分支预测(例如,如果分支指令需要内存读取),以允许它在等待内存访问完成时仍然做一些有用的工作。在现代处理器中,L1 缓存应该包含 大部分 被访问的内存,因此大多数(90%+?)时间的影响并不像 150 周期的 RAM 命中那么糟糕。
  • 嗯,这很有道理,所以在小情况下,RAM 命中 150 个周期,流水线实际上会停顿那么多周期,对吧?

标签: cpu-architecture cpu-cache pipelining


【解决方案1】:

Classic 5-stage RISC pipelines 是围绕单周期延迟 L1d / L1i 设计的,允许在代码中使用 1 个 IPC(每时钟指令),而不会出现缓存未命中或其他停顿。即希望常见/好的案例。

当时的时钟速度较低(甚至相对于 1 个门延迟),因此您可以在一个周期内完成更多工作,而且缓存更简单,通常是 8k 直接映射、单端口,有时甚至是虚拟标记 (VIVT)所以 TLB 查找不是访问延迟的一部分。

(与modern Intel/AMD using 32kiB 8-way VIPT L1d/L1i caches 相比,L1d 至少有 2 个读取 + 1 个写入端口,在如此高的时钟速度下访问延迟4 cycles best-case on Intel SnB-family, or 5 cycles including address-generation。现代 CPU 也有更大的 TLB,这也增加了延迟。当乱序执行和/或其他技术通常可以隐藏该延迟时,这是可以的,但是经典的 5 阶段 RISC 只有一个管道,而不是单独的流水线内存访问。另见@987654324 @ 获取更多关于现代超标量乱序 exec x86 CPU 与经典 RISC CPU 的性能有何不同的链接。)

如果您想提高时钟速度以获得相同的晶体管性能(门延迟),如果缓存,您可以将 fetch 和 mem 阶段分成多个流水线阶段(即流水线更重)访问甚至在关键路径上(即,如果缓存访问不能再在一个时钟周期内完成)。延长流水线的不利之处在于增加了分支延迟(错误预测的成本,以及正确预测必须隐藏的延迟量),以及增加晶体管的总成本。


请注意,经典 RISC 流水线在 EX 阶段进行地址生成,使用那里的 ALU 计算寄存器 + 立即数,大多数 RISC ISA 支持的唯一寻址模式是围绕这种流水线构建的。因此,由于转发回 EX 的负载延迟,负载使用延迟实际上是 2 个周期的指针追踪。)


在缓存 miss 上,整个 管道只会停止:那些早期的管道缺少 store buffer 来将执行与存储未命中分离,或从 L1d 缓存加载的 hit-under-miss / miss-under-miss。

还请记住,对于 MIPS R2000 等早期 CPU,CPU 速度相对于内存没有那么高,并且单核机器不需要内核和内存控制器之间的互连。 (尽管他们可能确实有一条到单独芯片上的内存控制器的前端总线,即“北桥”。)但无论如何,当时对 DRAM 的高速缓存未命中花费的核心时钟周期要少得多。每次失误都完全停止很糟糕,但它不像现代 CPU,它可以在 150 到 350 个周期范围内(70 ns * 5 GHz)。 DRAM 延迟的改善几乎没有带宽和 CPU 时钟那么多。另请参阅具有“内存墙”部分的 http://www.lighterra.com/papers/modernmicroprocessors/Why is the size of L1 cache smaller than that of the L2 cache in most of the processors? 回复:为什么现代 CPU 需要多级缓存,因为 CPU 速度和内存延迟之间的不匹配越来越大。

后来的 CPU 允许逐步提高内存级别的并行性,方法是允许执行在非故障加载(成功的 TLB 查找)后继续执行,只有在您实际读取最后一个寄存器时才会停止如果加载结果尚未准备好,则由加载写入。这允许在仍然很短且相当简单的有序管道上隐藏负载延迟,并使用一些负载缓冲区来跟踪未完成的负载。通过寄存器重命名 + OoO exec,ROB 大小基本上是您可以隐藏缓存未命中延迟的“窗口”:https://blog.stuffedcow.net/2013/05/measuring-rob-capacity/

现代 x86 CPU 甚至在前端的流水线阶段之间有缓冲区,以隐藏或部分吸收提取气泡(由 L1i 未命中、解码停滞、低密度代码(例如跳转到另一个跳转)或什至只是未能预测一个简单的始终采用的分支。即仅在最终解码时检测它,在获取正确路径以外的其他内容之后。没错,即使是无条件分支,例如 jmp fooneed some prediction 用于获取阶段。)

https://www.realworldtech.com/haswell-cpu/2/ 有一些很好的图表。当然,英特尔 SnB 家族和 AMD Zen 家族使用解码的微指令缓存,因为 x86 机器代码很难并行解码,因此它们通常可以绕过一些前端复杂性,从而有效地缩短管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2012-01-22
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多