我指的是MIPs数据路径让我们说这里有MIP组装程序,这里有5阶段流水线IF/ID/EXE/MEM/WB,没有转发,并且假设所有指令都经过每个阶段,尽管它可能不会产生有意义的结果:
...
add $t0, $s1, $s0
sw $t0, 0($s2)
...有原始数据风险吗?我目前的思维过程是:
$t0 <- $s1 + $s0
mem0 + $s2 <- $t0
然后是在写之后读取的,因为我们首先写入$t0 (在add),然后读取$t0将其放入内存。此外,当SW处于ID时,ADD在ALU/EXE阶段执行加法。因此,SW的ID相位反映了添加前的$t0值,可以对结果进行回溯。
我知道有一个类似的问题:MIPS中是否存在执行存储数据危险?
但我的情况非常具体,这对我没有多大帮助,因为他假设指令可以不用某些阶段执行。
发布于 2020-03-30 02:48:03
是的,当然有生的危险。一条指令读取前一条指令的结果,其间隔比流水线长度小得多。维基百科:公害
如果一条指令在寄存器文件中可用数据之前试图使用数据,则会发生数据危害。
像R2000这样的典型商业MIPS具有绕过转发的特性,并且不必停止,因为它的转发逻辑检测到危险(它仍然存在),并将从add的EX结果转发到sw的寄存器读取穆xer。因此,继续到管道的其余部分,该指令具有$t0的转发值和$s2的寄存器文件值。绕行
如果没有旁路转发的话,你就得拖延时间了。假设SW仍然在正常时间,在ID阶段从寄存器文件中读取其输入操作数。如果您可以让商店延迟读取它们的数据寄存器(在MEM状态开始时),以减少1的失速周期,那么可以这样做,但这可能需要在寄存器文件中增加一个读取端口,因为ID阶段也可能正在读取2条指令。
您的管道仍然需要检测危险,并能够暂停它(联锁)。简单ALU指令的有效延迟超过一个周期是非常糟糕的,这就是为什么所有真实的RISC管道都会进行转发,而不是仅仅检测和延迟。编译器有足够的时间调度代码来填充负载延迟和分支延迟槽,而不必为每个简单的ALU指令隐藏延迟!
发布于 2020-03-30 02:41:48
这确实是一种管道危险,为了减轻这种危险,需要一个旁路。观察到第二条指令所需的值在需要时实际上是可用的,这是旁路的基础。在一个简单的管道中,在写入目标寄存器之前,计算出的值在目标寄存器中是不可用的,这是在实际计算值之后的一个循环;然而,有了旁路,我们可以更快地重定向计算值(不写寄存器)。
https://stackoverflow.com/questions/60923189
复制相似问题