是否可以在基于 machine/ISA 的累加器中实现流水线?

Is it possible to implement pipelining in a accumulator based machine/ISA?

我不确定这是不是问这个问题的正确地点,但它是这样的:

我想知道是否有可能将流水线阶段实现到使用累加器来保存值以及 PC、内存缓冲寄存器、指令寄存器和内存地址寄存器的冯诺依曼架构中?还将有一个输出寄存器来保存输出和一个输入寄存器来保存输入。

我想知道这一点,并认为 3 级流水线(获取、解码、执行)比 5 级流水线更可行,因为这会引入额外的寄存器需求。

有这方面的例子吗?理论上可以实现吗?

当然,至少流水线化 fetch/decode,并且数据加载可能会特别有用,因为每条指令都将嵌入一个数据内存地址。

(一些指令可能允许内存间接寻址模式,即从内存加载一个指针然后取消引用它,允许间接寻址而无需自修改代码。在执行第二次加载。如果你想保持管道连贯,自修改代码对流水线特别是 OoO exec 来说很糟糕。你可以保持简单,只保证在跳转或其他事情后的连贯性,并丢弃 fetch/decode 结果跳转以确保你正在观察新存储的指令,如果你想支持自修改代码,比如一些玩具累加器 ISA 需要循环数组。(例如 Little Man Computer))

考虑到软件只有 1 个架构寄存器可以使用,使用乱序执行的寄存器重命名可能很有价值。考虑到有效的内存消歧(存储转发检测),具有存储转发功能的存储缓冲区将为内存/缓存提供等价物。参见 for more about what store buffers do, and links from there including https://blog.stuffedcow.net/2014/01/x86-memory-disambiguation/

请注意,现代 x86 CPUs 能够将 add eax, [mem] 内存源添加到累加器 mov [mem], eax 等指令蓄能器的商店。 (x86 有其他寄存器,但理论上你可以只用一个)。现代 x86 CPUs 将内存源 ALU 指令解码为 2 微指令,即加载和添加,它们在无序后端中单独执行。请参阅 现代微处理器 90 分钟指南! 构建更复杂 CPU 的温和介绍,包括现代 x86 解码到“类 RISC”微操作。

您可以构建与 Intel Sandybridge 系列非常相似的管道(请参阅 David Kanter 对 Haswell 前端和后端不同部分的框图的深入研究 - https://www.realworldtech.com/haswell-cpu/) 或 AMD Zen,运行 是一个累加器 ISA 而不是 x86。

或者让它更简单一些,比如 P5 Pentium(按顺序双发,没有解码成类似 RISC 的微指令,所以它也不能流水线化内存源 ALU 指令),或 486(在-订购流水线单期)。


我怀疑是否有任何商业示例; AFAIK 没有纯累加器 ISA 足够相关以至于任何人都想购买一个本质上低效的 ISA 的高性能实现,而不是购买一个 CPU 可以 运行 以相同的成本更快地注册 ISA美元、功率、硅和设计工作。

(即你 可以 这样做,或者你可以花费类似的努力来流水线一个好的 ISA,如 ARM、MIPS 或 RISC-V。或者甚至是更 CISCish 的东西,如 m68k .)


不过,没有理由假设玩具微体系结构只有一个 MAR/MBR/IR。每条指令都需要自己的 IR 通过管道,假设它是一个具有固定宽度指令的 ISA,甚至有一个 IR 是有意义的,而不是基于解码结果的控制信号。

解释了为什么现实世界的 x86 CPUs 不只有其中之一,而且根本没有“IR”。 MAR/MBR 对于流水线缓存访问来说是一个过于简单的模型,尤其是在具有虚拟内存的 CPU 上。