问题描述
(i1) lw $1,40($2)
(i2) add $2,$3,$3
(i3) add $1,$1,$2
(i4) sw $1,20($2)
鉴于不支持转发,我发现 $2 中会有数据风险(在线 i2 i3) 这个mips代码有什么危害吗?
如果支持转发,还有什么危害吗?
解决方法
首先,让我们声明这个问题适用于流水线处理器,而不是单周期处理器。
其次,让我们假设 WB
(回写)在循环开始时立即执行——这是现实的 b/c WB
不需要计算任何东西并且它的值存储到寄存器文件在周期开始时可用。
然后来自较晚指令的 ID
可以通过同一周期中的重叠捕获来自较早指令的 WB
写入的值。
cycle-> 1 2 3 4 5
(i1) IF ID EX MEM WB
(i2) IF ID EX MEM WB
(i3) IF ID EX MEM WB
(i4) IF ID EX MEM WB
(i5) IF ID EX MEM WB
在循环 5 中,当 (i1) 执行 WB
时,(i4) 可以读取 ID
中的正确值,因为它们是重叠的——并且按照上述,这足以让 (i4)读取 (i1) 写入的值。
然而,(i2) 和 (i3) 都看不到 (i1) 写入的值,因为它们的 ID
阶段读取值发生在 (i1) 的 WB
阶段之前。 (i2) 的 ID
阶段在周期 3 中,(i3) 的 ID
阶段在周期 4 中,而 (i1) 的 WB
阶段在周期 5 中.
(如果在同一个循环中重叠读/写不起作用,那么根据上图,只有ID
中的(i5)会看到(i1)的{{1 }}.)
因此,我们可以扩展此图(或将其应用于序列中的每条指令,就像 i1 一样)以查看示例中存在多少危险。
这意味着在您的序列中,(i1) 的 WB
的 WB
不可供任何 $1
读取,直到 (i4),然后 (i3) 将需要转发/绕过 (MEM->EX) 才能获得正确的值。
为了让 (i3) 获得 (i2) 对 ID
的更新,转发/绕过 (EX->EX) 是必要的。
为了让 (i4) 获得 (i2) 对 $2
的更新,转发/绕过 (MEM->EX) 是必要的。
为了让 (i4) 获得 (i3) 对 $2
的更新,转发/绕过 (EX->EX) 是必要的。
有一种情况(未在您的示例中显示)需要转发/旁路(MEM->EX)和停顿,当下一条指令获取紧接在前一个加载指令的目标值时,就会发生这种情况,因为负载的正确值只能从 MEM 中获得(而对于计算指令,正确的值可以从 EX 中获得)。