【问题标题】:hazards in a three-way superscalar pipeline三通超标量管道中的危险
【发布时间】:2013-11-05 22:48:17
【问题描述】:

通过与超标量架构相关的练习,我正在按照自己的方式工作。我需要一些帮助来概念化这个问题的答案:

“如果您对寄存器重命名器必须做什么感到困惑,请返回您正在执行的汇编代码,并问问自己必须发生什么才能获得正确的结果。例如,考虑一个三路超标量机器同时重命名这三个指令:

ADDI R1, R1, R1
ADDI R1, R1, R1
ADDI R1, R1, R1

如果R1的值一开始是5,那么这个序列执行完后它的值应该是多少?”

我可以看到,好吧,R1 的最终值应该是 40。但是,三路超标量机器如何达到这个答案?如果我理解正确的话,在这个三路超标量流水线中,这三个指令将被并行获取。意思是,你从一开始就会有危险,对吧?我应该如何概念化这个问题的答案?

编辑 1:在解码这些指令时,三路超标量机器必须执行寄存器重命名以获得以下指令集,正确:

  ADDI R1, R2, R3
  ADDI R4, R5, R6
  ADDI R1, R2, R3

【问题讨论】:

  • 指令集能否重命名为:ADDI R2, R1, R1 ADDI R3, R2, R2 ADDI R4, R3, R3 ?如果我错了,请纠正我。

标签: pipeline cpu-registers computer-architecture


【解决方案1】:

简单地说,您将无法同时执行这些说明。然而,这个例子的目标似乎与冒险无关(即 - 检测这些指令是相互依赖的,并且必须以足够的停顿顺序执行),它是关于 重命名 - 它用于表明单个逻辑寄存器 (R1) 将在流水线中同时运行多个物理“版本”。原来的值为 5(我们称之为“p1”),但您还需要为第一个 ADD(“p2”)的结果分配一个,用作第二个的源,然后再一次对于第二条和第三条 ADD 指令(“p3”和“p4”)的结果。

由于此处理器解码并尝试同时发出这 3 条指令,您可以看到您不能只将 R1 作为所有指令的源 - 这会阻止它们中的每一个使用正确的计算中间值,所以您需要重命名它们。重要的部分是我们称之为 p1..p4 的它们可以同时分配,并且在发布时就会知道依赖关系 - 早在它们中的每一个都被结果填充之前。这实质上将前端与执行后端分离,这对于现代 CPU 的性能灵活性很重要,因为您可能在任何地方都存在瓶颈。

【讨论】:

  • 感谢您的回复。我进行了编辑(编辑 1)。第三条指令可以这样吗,还是那里也需要寄存器重命名?
  • 原版没有问题,只是不会使用3宽的管道。重命名是一直在做的事情,整台机器会在物理寄存器 ID 中“对话”,经过某个管道阶段。顺便说一句 - 您的新代码与原来的代码不同
  • 点了。一般来说,我如何概念化寄存器的重命名方式?
  • 假设任何新结果都有自己的寄存器,并且所有依赖项都会相应更新。这打破了所有错误的依赖关系。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2022-07-29
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多