...因为对我来说及时转发数据已经没有意义了。
数据只能在时间上向前转发,不能向后转发,因为到 2021 年,我们仍然没有时间机器。
因此,转发必然会将处理器中刚刚生成的可用信息馈送到处理器中的其他地方,因此它可以在未来(即下一个周期)使用。
转发和停顿都是减轻 RAW 危害的两种方法——这个想法只是为了从生成的地方到需要的地方获取价值。
如果“需要的地方”在时间上早于“生成的地方”,则需要停顿。但是,如果“需要的地方”在时间上比“生成的地方”晚,那么前锋可以减轻危险。危险是由于管道假设“需要”是寄存器文件,这在背靠背操作中是不正确的。
有些危险需要前锋和失速,这是可以做到的最好的。
但是所有的危险都可以通过足够的停顿和不转发来减轻,尽管这会降低性能。有了足够的停顿,“需要的地方”和“生成的地方”都可以是寄存器文件。
问题是,我只能从指令 1 的 EX/MEM 寄存器转发。我想从 1 的 EX/MEM 转发到 3 的 ID/EX。
我们不能从 1 的 EX/MEM 直接转发到 3 的 ID/EX。为什么?因为,ID/EX 为 3 是两个循环,所以我们想要从那里转发的数据(EX/MEM 为 1)不再存在:它已经沿着管道向下移动到下一个阶段。到 3 的 ID/EX 想要该数据时,该数据现在位于 MEM/WB(例如 1)中——当时的 EX/MEM 正在执行指令 2。