查找所有先写后读 (RAW) 数据依赖项
Find all read-after-write (RAW) data dependencies
考虑 MIPS 中的以下代码:
lw , 40() # I1
add , , # I2
add , , # I3
sw , 20() # I4
我自己的答案是 RAW,从 I1 到 I3 和 I4,1 美元,从 I2 到 I3 和 I4,2 美元,从 I3 到 I4,1 美元。
然而,解决方案不包括从 I1 到 I4 的 $1。为什么会这样?
the solution doesn't include from I1 to I4.
I4 的存储数据($1)来自 I3,存储地址($2)来自 I2。它的输入都不是直接来自 I1.
I3 之后的任何东西都不需要 I1 负载的 $1 输出。
(在寄存器重命名的乱序 CPU 中,一旦 I3 add 退出就不再有对它的引用(因为保存它的体系结构 $1 寄存器已被覆盖),所以物理注册持有它可以被释放。)
有一个从加载开始到存储结束的依赖链,看看它很有用,但它与危险分析是分开的。
在代码中找到单独的依赖链与乱序执行高度相关,特别是找出dep链是否循环携带,或者每次迭代是否有单独的依赖链(允许OoOE重叠执行多次迭代)。独立的依赖链基本上与 CPU 可以找到并利用的指令级并行性相同。
考虑 MIPS 中的以下代码:
lw , 40() # I1
add , , # I2
add , , # I3
sw , 20() # I4
我自己的答案是 RAW,从 I1 到 I3 和 I4,1 美元,从 I2 到 I3 和 I4,2 美元,从 I3 到 I4,1 美元。
然而,解决方案不包括从 I1 到 I4 的 $1。为什么会这样?
the solution doesn't include from I1 to I4.
I4 的存储数据($1)来自 I3,存储地址($2)来自 I2。它的输入都不是直接来自 I1.
I3 之后的任何东西都不需要 I1 负载的 $1 输出。
(在寄存器重命名的乱序 CPU 中,一旦 I3 add 退出就不再有对它的引用(因为保存它的体系结构 $1 寄存器已被覆盖),所以物理注册持有它可以被释放。)
有一个从加载开始到存储结束的依赖链,看看它很有用,但它与危险分析是分开的。
在代码中找到单独的依赖链与乱序执行高度相关,特别是找出dep链是否循环携带,或者每次迭代是否有单独的依赖链(允许OoOE重叠执行多次迭代)。独立的依赖链基本上与 CPU 可以找到并利用的指令级并行性相同。