【问题标题】:Data Hazard(True Dependencies) in MIPSMIPS 中的数据危害(真正的依赖关系)
【发布时间】:2020-10-28 02:06:54
【问题描述】:
I1:LW R1, 0(R4) ; R1 ← address (0+R4)
I2:ADDI R2, R1, #8 ; R2 ← R1+8
I3:MULT R3, R1, R1 ; R3 ← R1*R1
I4:SW R3, 4(R2) ; address(4+R2) ← R3 

在上面的 MIPS 代码中,在解决方案表中,真正的依赖关系被标记为 R3 的 I3->I4。据我了解,真正的依赖关系是 RAW(写后读)危害或流危害。我很确定这是一个写后写的危险,因此不是真正的依赖。我这样说对吗?

【问题讨论】:

    标签: assembly dependencies mips cpu-architecture cpu-hazard


    【解决方案1】:

    写后写风险

    不,这不是写后写的危险。虽然 I4 似乎是一个写操作——相对于内存而言,它确实是一个写操作——从微观架构的角度来看,即仅在处理器内部,流水线阶段和寄存器所在的位置并进行操作,存储指令有两个来源操作数且没有寄存器目标。

    所以,R3 在被 I3 写入后被 I4 读取。 (换句话说,存储指令需要 R3 的值,作为执行内存存储的值;R3 的值与存储位置的地址和大小一起馈送到数据存储器,此处为 4)。因此,这是一个先读后写的风险。

    【讨论】:

    • 在一个稍微高级的带有存储缓冲区的管道中,存储和加载必须确保它们正确地看到彼此。但是,如果内存访问发生在与存储相同的管道阶段,则通过探测存储缓冲区进行存储转发意味着您永远不必在标量管道(每个时钟 1 个 insn)中停止存储/重新加载(内存位置的 RAW) ),假设存储转发延迟只有 1 个周期。与寄存器文件不同,它由 Decode 读取,由 write-back 阶段写入,这使得 RAW 冒险成为一个问题。
    • 商店确实有一个内存目的地,这在某些设计中可能很重要。但不是 register 目的地;这就是为什么我在该句子中添加了该限定词。
    • @PeterCordes,感谢您提供额外的见解(和改进的措辞)!
    • 我忘记链接en.wikipedia.org/wiki/…blog.stuffedcow.net/2014/01/x86-memory-disambiguation。进一步阅读:使用无序存储执行保持程序顺序,并避免使用 OoO exec 进行存储->重新加载时的停顿。 (当一个存储地址可能直到后面的加载地址之后才准备好时,这会变得非常棘手;现代 x86 CPU 动态预测加载是否是对未知地址存储的重新加载,并且可能如果他们猜错了,需要刷新管道。)
    猜你喜欢
    • 2019-06-03
    • 2014-06-20
    • 2016-07-22
    • 2012-10-14
    • 1970-01-01
    • 2014-03-14
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多