Warm tip: This article is reproduced from serverfault.com, please click

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

(assembly - Is it possible to implement pipelining in a accumulator based machine/ISA?)

发布于 2020-11-29 03:53:08

我不确定这是否是问这个问题的正确地方,但它来了:

我想知道是否有可能将流水线阶段实现到Von-Neuman体系结构中,该体系结构使用累加器与PC,存储器缓冲寄存器,指令寄存器和存储器地址寄存器一起保存值?还有一个用于保存输出的输出寄存器和一个用于保存输入的输入寄存器。

我对此很纳闷,并认为3级流水线(Fetch,Decode,Execute)比5级流水线更可行,因为这会引入额外的寄存器。

是否有任何示例,并且有可能在理论上实现?

Questioner
HotWheels
Viewed
11
Peter Cordes 2020-11-29 12:25:15

当然,当然,至少对流水线进行读取/解码,以及可能的数据加载将特别有用,因为每条指令都将在其中嵌入数据存储地址。

(某些指令可能允许使用内存间接寻址模式,即从内存中加载指针然后取消引用,从而允许在不进行自我修改代码的情况下进行间接寻址。有序管道在执行第二次加载时可能必须停顿。如果要保持管道的一致性,修改代码会给流水线特别是OoO exec带来很多麻烦,你可以使其保持简单,只保证在跳转或其他操作后保持一致性,并在跳转时丢弃获取/解码结果以确保你观察新存储的指令,如果你想支持自修改代码,例如某些玩具累加器,则ISA需要例如在数组上循环(例如Little Man Computer)。

鉴于软件只有1个体系结构寄存器可使用,因此乱序执行寄存器重命名可能会很有价值。给定有效的内存消歧(存储转发检测),具有存储转发功能的存储缓冲区将为内存/高速缓存提供等效功能。请参阅此问答以获取有关存储缓冲区功能的更多信息,以及来自那里的链接,包括https://blog.stuffedcow.net/2014/01/x86-memory-disambiguation/

请注意,现代的x86 CPU能够将诸如add eax, [mem]内存源add的指令流水线化到累加器中,并mov [mem], eax存储累加器。(x86还有其他寄存器,但是从理论上讲,你可以只使用它)。现代的x86 CPU将内存源ALU指令解码为2微指令,即负载和加法,它们在无序后端中分别执行。参见《现代微处理器90分钟指南》! 可以构建更复杂的CPU的入门介绍,包括将现代x86解码功能转换为“类似RISC”的微型操作程序。

你可以建立一个管道几乎完全一样的Sandy Bridge的英特尔家庭(见戴维·卡特与在Haswell的正面的不同部分的框图和后端深潜- https://www.realworldtech.com/haswell-cpu/)或AMD Zen,它运行累加器ISA而不是x86。

或使其更简单一些,例如P5 Pentium(按顺序发行的双重问题,而无需解码为类似RISC的uops,因此它也无法对存储源ALU指令进行流水线处理),或486(按顺序进行的流水线单一发行) 。


我怀疑是否有商业例子; AFAIK没有纯粹的累加器ISA具有足够的相关性,因此任何人都想购买本质上效率不高的ISA的高性能实现,而不是购买可以以相同的美元,功耗,硅片和设计成本更快运行寄存器ISA的CPU。努力。

(即,你可以执行此操作,或者你可以花费类似的精力来为ARM,MIPS或RISC-V等良好的ISA进行流水线化。甚至可以像m68k一样使用CISCish。)


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

x86寄存器:MBR / MDR和指令寄存器说明了为什么现实世界中的x86 CPU不只有其中之一,并且根本没有“ IR”。而且,对于流水线式缓存访问而言,MAR / MBR太简单了,尤其是在具有虚拟内存的CPU上。