mips在mips代码中发现结构危险数据危险
Mips finding structural hazard data hazard in mips code
(i1) lw ,40()
(i2) add ,,
(i3) add ,,
(i4) sw ,20()
鉴于不支持转发,我发现 $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.
(如果在同一个循环中重叠的read/write不起作用,那么根据上图,只有ID
中的(i5)会看到(i1的结果)的WB
.)
因此,我们可以扩展此图(或将其应用于序列中的每条指令,就像 i1 一样)以查看您的示例中有多少风险。
这意味着在您的序列中,(i1) 的 </code> 的 <code>WB
不可用于任何 ID
读取,直到 (i4),然后 (i3 ) 需要 forward/bypass (MEM->EX) 才能获得正确的值。
为了 (i3) 获得 (i2) 对 </code> 的更新,需要 forward/bypass (EX->EX)。</p>
<p>为了 (i4) 获得 (i2) 对 <code>
的更新,需要 forward/bypass (MEM->EX)。
为了 (i4) 获得 (i3) 对
的更新,需要 forward/bypass (EX->EX)。
有一种情况(未在您的示例中显示)需要 forward/bypass (MEM->EX) 和停顿,这发生在下一条指令立即获取目标值时之前的加载指令,因为正确的加载值只能从 MEM 获得(而对于计算指令,正确的值可从 EX 获得)。
(i1) lw ,40()
(i2) add ,,
(i3) add ,,
(i4) sw ,20()
鉴于不支持转发,我发现 $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.
(如果在同一个循环中重叠的read/write不起作用,那么根据上图,只有ID
中的(i5)会看到(i1的结果)的WB
.)
因此,我们可以扩展此图(或将其应用于序列中的每条指令,就像 i1 一样)以查看您的示例中有多少风险。
这意味着在您的序列中,(i1) 的 </code> 的 <code>WB
不可用于任何 ID
读取,直到 (i4),然后 (i3 ) 需要 forward/bypass (MEM->EX) 才能获得正确的值。
为了 (i3) 获得 (i2) 对 </code> 的更新,需要 forward/bypass (EX->EX)。</p>
<p>为了 (i4) 获得 (i2) 对 <code>
的更新,需要 forward/bypass (MEM->EX)。
为了 (i4) 获得 (i3) 对 的更新,需要 forward/bypass (EX->EX)。
有一种情况(未在您的示例中显示)需要 forward/bypass (MEM->EX) 和停顿,这发生在下一条指令立即获取目标值时之前的加载指令,因为正确的加载值只能从 MEM 获得(而对于计算指令,正确的值可从 EX 获得)。