gpt4 book ai didi

mips - 数据危险和停顿

转载 作者:行者123 更新时间:2023-12-03 19:06:33 27 4
gpt4 key购买 nike

我正在为明天的考试而学习,但在以下代码中遇到困难:

sub $2, $1, $3
and $12, $2, $5
or $13, $6, $2
add $14, $2, $2
sw $15, 100($2)
由于这里的 ALU-ALU 依赖于寄存器 $2 ,子指令直到第五阶段才写入其结果,这意味着我们将不得不在流水线中浪费三个时钟周期。我的问题是为什么是 3 个时钟周期?这种依赖性可以通过插入两个 nops 来解决,因此我们浪费了 2 个时钟周期?请向我澄清,因为我试图将 nops 与浪费的周期联系起来,我确信我在这里有一个巨大的误解。

最佳答案

流水线阶段的名称略低于标准。更常见的是使用IF(从指令存储器IM取指令)、ID(指令解码和寄存器读取)、EX(执行/ALU)、MEM(数据存储器读或写)和WB(写回寄存器结果)。
是 2 还是 3 个时钟周期取决于您的内部架构。
当设计为 3 个时钟周期方法时,处理器将不得不停顿 3 个周期,以便第一条指令(周期 5)的 reg 写入(WB)在第二条指令的 reg 读取(ID)可以看到之前完全完成- 迄今为止的值(value)。如果没有其他缓解措施,第二条指令的 reg 读取阶段在时钟周期 6 之前不能总是得到保证的正确值(而没有依赖性/危险,第二条指令最好在周期 3 中完成 reg 读取(ID)并延迟到 6 ,所以 6-3=3 周期延迟)。
当设计为 2 个时钟周期时,这意味着 reg 写入 (WB) 阶段,即时钟周期 5 中第一条指令的第 5 阶段,与也在时钟周期 5 中的第二条指令的解码 (ID) reg 读取阶段重叠。
这以以下两种方式之一起作用的原因:

  • 半个周期
  • WB 阶段非常快,并且它的数据在时钟周期的绝对开始时就准备好了(根本不需要计算任何东西)——它实际上在周期 5 的前半部分完成(这个例子)。
  • ID 阶段很慢,并在周期 5 的后半部分获取数据 - 因此,它获取的数据在此周期中发生的 reg 写入时是最新的。

  • 注册转发
  • WB 阶段的数据在时钟周期的绝对开始时可用,但 WB 需要整个周期。
  • ID 阶段访问寄存器文件,但寄存器文件知道此周期中发生的写操作,并具有内部转发以确保读取读取寄存器值或正在写入的新值。寄存器文件实际上有一个内部旁路,允许在同一周期内读取写入的值。


  • 我们将这些停顿称为有条件的——如果我们不这样做,那么每条指令都会停顿 2-3 个周期,以防下一条后续指令使用 ALU 结果。这几乎(但可能不完全)否定流水线的好处。
    请注意,我断言检测何时由于 ALU/ALU 依赖性而需要停顿的条件逻辑与执行 ALU/ALU 旁路的逻辑一样复杂(因为它们是相同的测试)。由于旁路完全缓解了性能问题,设计人员总是更喜欢旁路。
    旁路的想法是,第二条指令的 EX/ALU 阶段所需的值实际上在 CPU 中的某处可用——因为它已经在前一个时钟周期中计算出来了(该值只是不在正确的位置)。问题是第二条指令的 reg 读取 (ID) 获得了陈旧值:在适当的时候刷新它们(忽略这些陈旧值并直接从 ALU 输出中获取它们)是绕过解决方案。
    所以,我觉得谈论 ALU/ALU 依赖/危害的停顿很奇怪,当存在缓解解决方案时(例如绕过),我认为即使是原始 MIPS 也不需要软件 NOP 缓解 ALU/ALU 危害。 (它确实用于加载后使用,这是一种 MEM/ALU 危害,需要旁路和停顿,后者在原始 MIPS 中没有提供,因此软件必须确保使用与加载分开至少一条指令可能通过插入 NOP)。

    关于mips - 数据危险和停顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63527298/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com