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
2条答案
按热度按时间6gpjuf901#
如果指令不需要MEM阶段,则它不会在该阶段中驱动任何与存储器相关的信号,但 * 它仍然需要通过它 *。
这是浪费时间,但仍然比非流水线处理有所改进。但是IF/ID阶段在我们考虑的流水线中只有1条指令宽,所以它只会消耗延迟(对于早期的转发),而不是吞吐量。但是旁路转发解决了这个问题,数据能够在到达WB之前转发给后面的指令。
使经典MIPS 5级机器按需跳过MEM的一个想法是添加从EX到WB的数据路径并添加一些逻辑。
如果R类型指令在load 1之后出现,则会出现冲突:
CPU可以将EX的输出发送到MEM和WB,加上MEM级在需要该级时屏蔽从EX到WB的数据路径,并且在不需要MEM-WB数据路径时屏蔽MEM-WB数据路径.
这样,当MEM中已经有一条指令时,EX中的下一条指令将在下一个周期进入MEM(而不是WB):
如果前一条指令不需要MEM,则可以跳过一个阶段:
注1:存储不写入任何寄存器(除了程序计数器更新),所以如果你不需要更新任何中断处理或释放任何资源,可以跳过WB。在一个有存储缓冲区的CPU中,它的条目通常会在提交到L1 d缓存后释放,L1 d缓存不与流水线阶段之一绑定。但是加载会写寄存器,因此不能跳过WB,这样会产生写回冲突。
增编
值得注意的是,在第一个示例中,如果WB堆栈链接发生冲突,最好将整个流水线暂停1个周期,否则冲突将永远无法解决,并且所有后续指令都将通过MEM阶段,无论其类型如何。
无失速:
如果我们引入一个周期的停顿,则冲突得到解决:
请注意,从吞吐量的Angular 来看,这种优化并没有带来任何有用的东西。
管道稳定到较短的长度,但如果您将此图与MEM是强制性的图进行比较,您会在相同的周期中获得所有WB阶段!
如果A依赖于B,则A需要等待B到达其WB阶段(或EX,如果在流水线中存在转发),并且由于WB(或EX)阶段的位置在具有或不具有该优化的情况下是相同的,所以其对于软件是不可直接观察的(即,其没有益处)。
然而,较短的流水线消耗较少的能量,并且在刷新后重新填充更快,但是要真正利用跳过阶段的能力,需要一个超标量CPU(具有多个执行单元,以便EX和MEM可以重叠)。
ef1yzkbh2#
想象一条生产汽车的装配线。比方说,有些吉普车会在后面安装备用轮胎,有些则不会。为了模拟处理器,我们假设装配线正在生产不同的定制车辆,而不是暂时只设置一个功能。因此,如果没有车轮的吉普车跳过前面,它将在下一个位置撞上吉普车。那么会发生什么呢?它根本就没有安装轮子,而是在管道中沿着。
这是流水线或装配线设计的基本部分。您定义了步骤,无论是否使用该步骤,所有内容都将线性通过这些步骤。关键是同时处理多个指令/车辆。我的车每分钟都会从远端推出一个,比如说,这是否意味着制造一辆汽车需要一分钟?不,我们并行化了这个过程,这样你就可以同时制造很多辆汽车。指令也是如此,即使每一步都不执行一个功能,关键也是要并行化。
设计的关键是制造足够长的管道级(我不会像你所说的那样使用mips这个词,因为你是在谈论一本教科书,而不是一个产品化的设计,如果他们的设计仍然坚持这条管道,那么这可能就是为什么ARM只是走过去,然后接管世界时,mips可以或应该有)没有任何摊位或危险,但没有这样的延迟(一条指令100个时钟周期总共完成100个阶段),因此您可以平衡停顿和其他问题与延迟或管道中的时间。
因此,从设计上来说,浪费是绝对存在的,但就像你可以创建一个基准测试来显示管道的浪费、缓存的缓慢、由于分支预测而导致的性能损失一样。同样,如果你不喜欢管道,想一次处理一条指令,那么创建基准测试来发现性能缺陷要容易得多,因为即使有浪费,管道也会更快。对于那个基准。根据你的学位和你正在学习的课程,如果你是一个计算机工程师,基本上你可能会被分配串行mips设计和并行设计的任务,你可以使用你自己的实现来演示相同指令序列的串行与并行。
简短回答:除了特定的情况,一般来说,指令不能跳过一个步骤,因为有东西在那里使用那个逻辑。那个逻辑一次只能处理一个。有很多方法可以帮助这个。记住,你正在阅读一本教科书,为了教育的目的,试图理解基本原理。