我正在学习MIPS架构,但是我真的不明白一些概念…
例如,"无联锁的流水线级"。我还发现,只有MIPS的第一个实现没有它(互锁的流水线阶段)。但是我没有发现它是在女巫1中被引入的,有人能告诉我它是在女巫1中被引入的吗?
我想把重点放在"连锁阶段"上。我理解这个概念意味着,例如,添加显式的nop操作,延迟指令(例如分支)的执行。这是真的吗?还是我的结论很糟糕?
此外,如果第一个版本的MIPS没有"互锁阶段",它是如何管理分支预测的?
谢谢大家的建议!
添加显式nop操作,延迟指令的执行
在执行延迟槽中的指令时,要理解体系结构状态是延迟的,而不是"添加一个no",即立即之前的指令的效果不会被延迟槽中的指令看到。
让软件来做"联锁"而不是硬件。
当硬件不互锁时,延迟槽暴露给软件,因此软件必须通过变换代码来适应,或者如果它在延迟槽中找不到任何有用的操作,则用nop指令填充延迟槽。
参见https://en.m.wikipedia.org/wiki/Delay_slot:
加载延迟槽是在加载(内存中的寄存器)后立即执行的指令,但不需要等待加载结果。负载延迟槽是非常罕见的,因为负载延迟在现代硬件上是高度不可预测的。负载可以从RAM或缓存中得到满足,并且可能由于资源争用而减慢速度。在非常早期的RISC处理器设计中可以看到负载延迟。MIPS I ISA(在R2000和R3000微处理器中实现)存在这个问题。
From https://en.wikipedia.org/wiki/MIPS_architecture#MIPS_II:
MIPS II移除加载延迟槽
虽然从维基百科的文章中并没有完全清楚,但分支延迟槽显然慢慢消失了,首先是在MIPS II中,通过提供只在所取分支上执行延迟槽指令的分支版本,然后在MIPS32中,"一个没有延迟槽的新分支家族"。
总之,延迟槽已经被放弃了,因为它们实际上只适用于特定的微架构;因为随着技术的发展,这些设计的特点变成了挑战,而不是提供它们原来的好处。
此外,如果MIPS的第一个版本没有"互锁阶段",它是如何管理分支预测的?
据我所知,MIPS I并没有真正进行动态分支预测,而是简单地假设未采取分支,然而,通过延迟一条指令的分支执行,它减少了在实际采取分支时假设未采取分支的成本。它还只支持非常简单的条件分支指令(例如等于或不等于),这样,分支接受/不接受的计算可以在管道中更早地执行,也许早在ID阶段。