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

Assembly 是否可以在基于累加器的机器/ISA中实现流水线?,assembly,pipeline,cpu-architecture,accumulator,Assembly,Pipeline,Cpu Architecture,Accumulator,我不确定这是否是问这个问题的正确地点,但这里是: 我想知道是否有可能在冯·诺依曼体系结构中实现流水线阶段,该体系结构使用累加器与PC、内存缓冲寄存器、指令寄存器和内存地址寄存器一起保存值?还有一个输出寄存器用来保存输出,还有一个输入寄存器用来保存输入 我想知道这一点,并认为3级管道(获取、解码、执行)比5级管道更可行,因为这将引入额外寄存器的需要 有这样的例子吗?理论上可以实现吗?当然,至少可以通过管道获取/解码,而且数据加载可能会有额外的帮助,因为每个指令都会嵌入一个数据内存地址 (某些指令可

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

我想知道是否有可能在冯·诺依曼体系结构中实现流水线阶段,该体系结构使用累加器与PC、内存缓冲寄存器、指令寄存器和内存地址寄存器一起保存值?还有一个输出寄存器用来保存输出,还有一个输入寄存器用来保存输入

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


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

当然,至少可以通过管道获取/解码,而且数据加载可能会有额外的帮助,因为每个指令都会嵌入一个数据内存地址

(某些指令可能允许内存间接寻址模式,即从内存加载指针,然后取消引用,允许在无需自修改代码的情况下进行间接寻址。在执行第二次加载时,顺序管道可能必须暂停。自修改代码对于管道化来说非常耗时,特别是OoO exec,如果您想保留的话p管道一致性。如果您想支持像某些玩具累加器需要的自我修改代码(例如,在数组上循环),您可以保持它的简单性,并且只保证跳转或其他操作后的一致性,并放弃跳转时的获取/解码结果,以确保您正在观察新存储的指令

考虑到软件只有一个体系结构寄存器可供使用,在无序执行的情况下重命名寄存器可能会很有价值。在有效消除内存歧义(存储转发检测)的情况下,具有存储转发功能的存储缓冲区将为内存/缓存提供等效功能。有关存储缓冲区的作用以及其中的链接的详细信息,请参阅

请注意,现代x86 CPU能够将指令(如
addeax[mem]
内存源添加到累加器中)和
mov[mem],eax
累加器的存储)流水线化(x86有其他寄存器,但理论上,您可以仅将其与一个寄存器一起使用).现代x86 CPU将内存源ALU指令解码为2个UOP、load和add,它们分别在无序后端执行。有关构建更复杂CPU的温和介绍,请参阅,包括现代x86解码为“RISC样”微操作

您可以构建一个与Intel Sandybridge系列非常相似的管道(请参阅David Kanter在Haswell中的深入研究,其中包含前端和后端不同部分的方框图)或AMD Zen,它运行的是累加器ISA而不是x86

或者让它简单一点,比如P5奔腾(按顺序双发行,而不解码为RISC(如UOP),因此它也不能流水线存储源ALU指令),或者486(按顺序流水线单发行)


我怀疑是否有任何商业例子;恐怕没有一个纯粹的累加器ISA足够相关,以至于任何人都想购买一个本质上效率低下的ISA的高性能实现,而不是购买一个CPU,以同样的成本(美元、电力、硅和设计)运行寄存器ISA的速度更快

(也就是说,您可以这样做,或者您也可以花费类似的努力来构建一个好的ISA,比如ARM、MIPS或RISC-V,或者甚至是一些更顺时针的东西,比如m68k。)


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

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

同样相关:对于累加器、堆栈和注册机的分类。