assembly MIPS流水线阶段-当指令不需要阶段时会发生什么,如ALU指令的MEM?

vql8enpb  于 2023-03-18  发布在  其他
关注(0)|答案(2)|浏览(193)

我知道有五个阶段-〉IF、ID、EX、MEM、WB,时钟周期由最长的阶段决定。我不明白的是,当有一条指令没有使用所有阶段时会发生什么,例如,加法指令不需要MEM阶段,时钟周期为200 ps,这意味着,对于使用所有阶段的指令,执行时间为1000 ps。执行不使用MEM斯泰格的指令是否也需要同样的1000 ps(这意味着浪费了200 ps)?谢谢!

6gpjuf90

6gpjuf901#

如果指令不需要MEM阶段,则它不会在该阶段中驱动任何与存储器相关的信号,但 * 它仍然需要通过它 *。
这是浪费时间,但仍然比非流水线处理有所改进。但是IF/ID阶段在我们考虑的流水线中只有1条指令宽,所以它只会消耗延迟(对于早期的转发),而不是吞吐量。但是旁路转发解决了这个问题,数据能够在到达WB之前转发给后面的指令。
使经典MIPS 5级机器按需跳过MEM的一个想法是添加从EX到WB的数据路径并添加一些逻辑。
如果R类型指令在load 1之后出现,则会出现冲突:

IF ID EX MEM WB
   IF ID EX  WB <-- Conflict: two instructions in WB

CPU可以将EX的输出发送到MEM和WB,加上MEM级在需要该级时屏蔽从EX到WB的数据路径,并且在不需要MEM-WB数据路径时屏蔽MEM-WB数据路径.
这样,当MEM中已经有一条指令时,EX中的下一条指令将在下一个周期进入MEM(而不是WB):

IF ID EX MEM  <-- Here EX-WB is masked (since MEM is used) and MEM-WB is allowed
   IF ID EX   <-- Can go to both MEM and WB but EX-WB is masked off

IF ID EX MEM WB  <-- So this instruction's next stage is WB (as usual)
   IF ID EX  MEM <-- This goes to MEM instead, so the pipe keeps flowing

如果前一条指令不需要MEM,则可以跳过一个阶段:

IF ID EX  <-- Here EX-WB is allowed (assume no prev instructions) and MEM-WB is not since (MEM was not used)
   IF ID 

IF ID EX WB <-- Instruction skips MEM stage since EX-WB was allowed
   IF ID EX <-- Next instruction, again, EX-WB is allowed since MEM was not used

IF ID EX WB <-- Done
   IF ID EX  WB <-- Stage MEM skipped

注1:存储不写入任何寄存器(除了程序计数器更新),所以如果你不需要更新任何中断处理或释放任何资源,可以跳过WB。在一个有存储缓冲区的CPU中,它的条目通常会在提交到L1 d缓存后释放,L1 d缓存不与流水线阶段之一绑定。但是加载会写寄存器,因此不能跳过WB,这样会产生写回冲突。

增编

值得注意的是,在第一个示例中,如果WB堆栈链接发生冲突,最好将整个流水线暂停1个周期,否则冲突将永远无法解决,并且所有后续指令都将通过MEM阶段,无论其类型如何。
无失速:

mem = Useless MEM stage but necessary to avoid a WB confict
MEM = Instruction uses the MEM stage

IF ID EX MEM WB
   IF ID EX  mem WB
      IF ID  EX  mem Wb

如果我们引入一个周期的停顿,则冲突得到解决:

Lowercase names means stalled cycles

IF ID EX MEM WB
   IF ID EX  ex  WB
      IF ID  id  EX WB
         IF  if  ID EX WB
                 IF ID EX WB
                    IF ID EX WB

请注意,从吞吐量的Angular 来看,这种优化并没有带来任何有用的东西。
管道稳定到较短的长度,但如果您将此图与MEM是强制性的图进行比较,您会在相同的周期中获得所有WB阶段!
如果A依赖于B,则A需要等待B到达其WB阶段(或EX,如果在流水线中存在转发),并且由于WB(或EX)阶段的位置在具有或不具有该优化的情况下是相同的,所以其对于软件是不可直接观察的(即,其没有益处)。
然而,较短的流水线消耗较少的能量,并且在刷新后重新填充更快,但是要真正利用跳过阶段的能力,需要一个超标量CPU(具有多个执行单元,以便EX和MEM可以重叠)。

ef1yzkbh

ef1yzkbh2#

想象一条生产汽车的装配线。比方说,有些吉普车会在后面安装备用轮胎,有些则不会。为了模拟处理器,我们假设装配线正在生产不同的定制车辆,而不是暂时只设置一个功能。因此,如果没有车轮的吉普车跳过前面,它将在下一个位置撞上吉普车。那么会发生什么呢?它根本就没有安装轮子,而是在管道中沿着。
这是流水线或装配线设计的基本部分。您定义了步骤,无论是否使用该步骤,所有内容都将线性通过这些步骤。关键是同时处理多个指令/车辆。我的车每分钟都会从远端推出一个,比如说,这是否意味着制造一辆汽车需要一分钟?不,我们并行化了这个过程,这样你就可以同时制造很多辆汽车。指令也是如此,即使每一步都不执行一个功能,关键也是要并行化。
设计的关键是制造足够长的管道级(我不会像你所说的那样使用mips这个词,因为你是在谈论一本教科书,而不是一个产品化的设计,如果他们的设计仍然坚持这条管道,那么这可能就是为什么ARM只是走过去,然后接管世界时,mips可以或应该有)没有任何摊位或危险,但没有这样的延迟(一条指令100个时钟周期总共完成100个阶段),因此您可以平衡停顿和其他问题与延迟或管道中的时间。
因此,从设计上来说,浪费是绝对存在的,但就像你可以创建一个基准测试来显示管道的浪费、缓存的缓慢、由于分支预测而导致的性能损失一样。同样,如果你不喜欢管道,想一次处理一条指令,那么创建基准测试来发现性能缺陷要容易得多,因为即使有浪费,管道也会更快。对于那个基准。根据你的学位和你正在学习的课程,如果你是一个计算机工程师,基本上你可能会被分配串行mips设计和并行设计的任务,你可以使用你自己的实现来演示相同指令序列的串行与并行。
简短回答:除了特定的情况,一般来说,指令不能跳过一个步骤,因为有东西在那里使用那个逻辑。那个逻辑一次只能处理一个。有很多方法可以帮助这个。记住,你正在阅读一本教科书,为了教育的目的,试图理解基本原理。

相关问题