gpt4 book ai didi

architecture - 流水线图,如果前一个 EX 使用相同的寄存器,ID 可以启动吗?

转载 作者:行者123 更新时间:2023-12-02 01:42:19 24 4
gpt4 key购买 nike

我最近开始使用计算机体系结构。我对我试图整理的图表感到困惑。基于依赖关系并为了避免危险,我设计了下表。但是我不确定两个阶段是否可以同时从同一个寄存器中读取。这是表格和带有突出显示混淆区域的 mips。 enter image description here

编辑:添加了替代方案

删除一个档位是否正确,因为 r0 的值已经被处理了?

enter image description here

最佳答案

“使用”太笼统了,您需要在对寄存器的读取和写入之间进行拆分。
如果你问“同时阅读”——当然,这就是流水线的重点。只要寄存器值不改变,反复读取就没有问题。
实际上,ID 和 EX 阶段不使用相同的资源,因此不存在冲突 - EX 阶段读取的值来自 ID 阶段在前一个周期写入的锁存器。

您认为是单个全局值的寄存器实际上沿管 Prop 有多个副本,每个副本对应于程序中某个点的值。如果您将最后两条指令用于例如,都读取 $r0,那么 ID 阶段将在第 7 周期为 OR 从寄存器文件中读取它,将其写入锁存器,然后在第 8 周期为 XOR 再次读取它,而 OR 处于 EX 阶段,同时取上一个周期的锁存值。

现在真正的问题来了,当您有数据危险时,例如由第一条指令引起的危险。由于在任何给定阶段的寄存器值必须反射(reflect)它根据程序顺序具有的真实值,如果您尝试在周期 2 上为 Sub 指令执行 EX 阶段,您将遇到问题,因为 $r0 值已被读取不代表前一个循环的加法结果。实际上,只有在第 4 周期 Add 完成回写后,寄存器文件中的值才会准备好。这称为 RAW(写后读)冲突,必须修复,否则程序将产生虚假结果。解决此问题的一种方法是在检测到此危险后添加一个停顿(如图中带星号的图所示)——当读取 $r0 的指令最终继续时,它们将更新值(添加后)已写入锁存器。另一个(更有用的)解决方案是添加特殊的逻辑来绕过新值,一旦它准备好所有需要它的管道阶段。在这种情况下,这可能仍然需要暂停,因为指令是背靠背的,因此您甚至没有时间在下一条指令需要之前执行操作。

最后一点 - 请记住,处理器,即使是像流水线 mips 这样简单的处理器,也都是在骗你。它们让你相信你正在运行你编写的程序,而实际上它们在内部做了各种各样的事情而不告诉你(一个稍微更高级的例子是乱序执行)。在这种情况下,它们让您认为指令是连续执行的,而实际上它们在前一个完成(甚至执行)之前推测性地开始每个指令。这当然在大多数情况下都有效,并且使处理器在指令吞吐量(或 IPC)方面的性能要好得多,但在某些情况下(例如数据危险、控制危险等),这可能会完全破坏您的程序,所以他们必须通过添加隔间或冲洗管道来隐藏这一点。

关于architecture - 流水线图,如果前一个 EX 使用相同的寄存器,ID 可以启动吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27805094/

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