【问题标题】:Number of stall cycles when there is only EX/MEM pipeline registers or only MEM/WB pipeline register只有 EX/MEM 流水线寄存器或只有 MEM/WB 流水线寄存器时的停顿周期数
【发布时间】:2021-10-09 16:21:48
【问题描述】:

我正在处理与处理器有关的问题。题为《计算机组织与设计(第6版)》一书中的问题4.12。问题有如下假设: 这是一个图像 图 4.45

而第 3 个问题让我坚持了下来

这个问题的答案是 MEM/WB 的停顿周期数(CPI 为 1.35)比 EX/MEM(CPI 为 1.45)少。我对这个答案的解释感到很困惑。 它指出:

仅从 EX/MEM 寄存器转发,EX 到第一个依赖项 可以在没有停顿的情况下得到满足,但没有任何其他依赖(即使 连同 EX 到第 1) 招致一个周期的停顿。仅转发自 MEM/WB 寄存器,EX 到第二个依赖项不会产生停顿。 MEM 到 1 依赖仍然会导致一个周期的停顿,现在 EX 到第一个依赖 导致一个停顿周期,因为我们必须等待指令完成 MEM阶段能够转发到下一条指令

只用 EX/MEM 流水线寄存器,EX 到 1st 是正确的,但是,我不能证明所有其他情况只需要一个 STALL CYCLE。例如,在 MEM 到 1st 的情况下,我认为它需要 2 个停顿周期,因为现在结果是在 MEM 阶段产生的,它没有任何 MEM/WB 流水线寄存器来保存结果并将其转发到下一条指令.因此,再加上 2 个停顿周期,就会得到正确的结果。还有一件事我想告诉你的是,在“EX 到 1 和 MEM 到 2”的情况下,在答案中,它还需要一个循环来解决这里的危险。这让我很困惑,因为它与只需要 1 个周期的“MEM to 1st”的情况相冲突。

同样在下一个只有 MEM/WB 管道寄存器的情况下。你有任何证据来解释这个答案吗?我真的很期待你对这个问题的回答

【问题讨论】:

    标签: assembly architecture mips cpu-architecture pipelining


    【解决方案1】:

    这与拥有流水线寄存器无关(或没有流水线寄存器,它根本无法工作),而是拥有提供数据以减轻 RAW 危险而不是导致停顿的旁路/转发多路复用(这很愚蠢,因为检测条件的逻辑必须在两种情况下都实现,否则处理器将无法工作)。

    您的想法是正确的,如果没有旁路/转发,则 MEM 到 1st 需要 2 个停顿周期,而使用旁路/转发,只有 2 个周期中的一个被缓解,另一个停顿周期仍然存在并且不能通过旁路/转发删除。为什么?因为在第一个 after 的 EX 所需的一个周期之后,第一个 after 所需的数据在处理器中的任何地方根本不可用。

    在绕过/转发的其他情况下,数据可在处理器中的某个位置在正确的时间进行第 1 次或第 2 次之后 - 只是数据不在正确的位置,因此绕过/转发修复了.例如,在 add 指令完成其 EX 之后的循环中,算术加法运算的值在处理器中的某个位置,但尚未在目标寄存器中。之后的第一条指令使用该目标(例如,另一个加法)自然会在一个周期后进入 EX 阶段,因此正确的数据在时间上是可用的,但根本不在正确的位置(这将是先验的目标寄存器),因此旁路实现了 RAW 危险并选择先前的 EX 输出而不是从第一个后的 ID 阶段寄存器读取的陈旧值。

    而对于第一个 RAW 的 MEM,数据在第一个后 EX 阶段之后的 1 个周期之前在处理器中的任何地方都不可用,因此使用了一个停顿加一个旁路,这是可以做到的最好的。

    他们要问的是三路多路复用器的成本,该多路复用器可以在同一时钟周期内选择从 EX 旁路/转发、从 MEM 旁路/转发,还是从 ID 读取非转发/寄存器.

    如果您想支持上述三项中的任何一项,则需要一个三路多路复用器(或两级两路多路复用器)。删除任何一项,您可以减少混合。


    您可以搜索加载/使用 RAW 危害以获取更多详细信息。

    本质上,假设在时间IF 进入t 的加载指令因此在IDt+1,在EXt+2,在MEMt+3 @ 和 WB t+4,总共五个周期。

    如果该加载(例如lw $a0, 0($a1) 之后紧跟一条使用加载目标寄存器的指令(例如addi $t0, $a0, 1),则该指令(addi)在时间@ 进入管道IF 987654336@,它在t+2 进入ID,在t+3 进入EX。在循环t+3 开始时,addi 执行所需的数据 - 使用 @ 中的 ALU 的增量987654343@ - 不在处理器中,直到t+3 结束时才会到达处理器,这是负载的 MEM 周期的结束。因此,即使使用旁路/转发,停止周期也是不可避免且需要。在这种情况下,停顿将addis EX 阶段延迟到t+4,此时数据在处理器中的某处可用。在t+4,负载的数据可以从架构寄存器文件(尽管这需要三重移植寄存器文件的读取端,并且还可能增加设置循环时间以适应它),或者从 MEM/WB 流水线寄存器中获取)。

    由于在ID 阶段读取体系结构寄存器文件以获取源操作数值,因此没有旁路/转发,需要两个停顿来延迟addis ID(理想情况下会发生在@ 987654352@) 直到t+4 可以在架构寄存器文件中看到加载的WB 阶段的结果。

    【讨论】:

    • 我认为不正确,因为“MEM to 1st”意味着只有在MEM阶段完成后才能获得结果(例如load指令)。为了转发这个结果,下一条指令应该有一个 MEM/WB 寄存器,对吧?但是,在这种情况下,假设没有 MEM/WB 寄存器。所以应该没有 FORWARD/BYPASS 并且它返回到正常情况,没有 FORWARD/BYPASS,还有 2 个停顿周期
    • MIPS 流水线将单个指令的执行分为 5 个阶段,每个阶段占用一个周期。处理器从任何给定指令的 ID 阶段的寄存器文件(不是流水线寄存器)中获取操作数。处理器可以选择从流水线寄存器中获取值(基本上覆盖在指令的早期 ID 阶段获得的值),并且它应该在存在危险时执行此操作,例如在危险情况下,ID 阶段寄存器文件读取操作已返回过时的值。
    • 无论危险如何,都必须有一个 MEM/WB 流水线寄存器。有必要将 MEM 阶段的值写入 WB 阶段的目标寄存器。即使对于非加载(例如 R-Type)指令,也必须有 MEM/WB 流水线寄存器。 (在 R-Type 指令的情况下,MEM/WB 流水线寄存器仅保存 EX/MEM 流水线寄存器的副本,但延迟一个周期,并且不受 MEM 阶段的影响。)只有 WB 阶段可以写入寄存器文件,并且每条指令在WB阶段获得一个周期,因此它可以将其结果写入架构寄存器文件。
    • 阶段之间的流水线寄存器是一个流水线实现细节,完全独立于架构定义的寄存器文件(32 个寄存器)。流水线寄存器的目的是在一个时钟周期结束时从一个阶段捕获结果,并在下一个时钟周期开始时将这些结果提供给下一个阶段。因此,这些流水线寄存器将指令从一个阶段移动到另一个阶段。它们是独立于旁路/转发所必需的。
    • 当存在危害时,可以通过绕过/转发来进行缓解,直接从一些流水线寄存器,如果一些流水线寄存器具有适当的体系结构值(根据某些代码序列需要的值)。当没有流水线寄存器实际上具有体系结构所需的值时,必须发生停顿以等待它。在使用该目标寄存器后,在一条指令(加载)中涉及 MEM 和在第一条指令中涉及 EX 的 RAW 危险就是这种情况。
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2021-12-04
    • 1970-01-01
    • 2023-03-04
    • 2014-08-04
    • 1970-01-01
    相关资源
    最近更新 更多