研究流水线处理器,他们提到预测正在采取或未采取的分支,插入显着的指令"临时"在我们决定是否采取分支之前,然后"挤压"他们,如果我们猜错了。
我们如何压制它们?我们不回信吗?我们可以在过渡期间插入多少指令来确定它是否为一个分支并弄清楚是否采取了这些指令。我想只有一个,对 - 因为我们发现它是ID中的一个分支,然后弄清楚是否在EX中使用?那么只有一个可以贬低的内容。
IF-> ID-> EX-> MEM-> WB
答案 0 :(得分:2)
错误预测分支阴影中的指令是假的 - 不正确,并且用户永远不应该看到(流水线操作有点作弊,对于外部世界我们假装CPU执行一条指令时间,完美的顺序)。因此,应该清除这些推测性指令,而不会产生任何架构效应,例如写入存储器或更改寄存器的值。
由于执行按顺序完成,并且最终的分支分辨率在EX中已知,您应该有足够的时间告诉管道中的以下指令取消它们(有效地用气泡代替它们,机器在那里在以下任何管道阶段都没有任何东西)。你对机器产生影响的阶段是在管道的下方,因此没有任何不良指令会过早地到达它们。这将在无序机器上变得更加复杂,但这是一个不同的故事。唯一浪费的工作存在于前面的阶段,你在这里有2个(IF + ID),并且可能(取决于你的设计)下一个周期即将被提取到IF的下一条指令(如果你不知道的话) t有时间在分支之后纠正你的程序计数器。在更复杂的机器上你可能有更多阶段的更深的管道,所以惩罚增加。
清除错误预测分支后面的错误指令的行为通常称为刷新,清除或挤压(请注意,这些术语在计算机体系结构中也可能有不同的含义,因此它不是技术术语,因为它是图形描述)
答案 1 :(得分:1)
我将添加Leeor回答说,在大量流水线超标量处理器的情况下,分支预测更有影响力。虽然动态(来自OoO)和推测(来自分支预测)是两个独立的概念,但它们interplay是复杂的。此外,由于它们通常在现代建筑上一起出现,因此有时会混淆。
在您考虑的简单5阶段管道中,ID和EX之间需要一个时钟周期来确定是否采用了分支。在更复杂的体系结构中,错误预测的代价是数十个时钟周期的数量级,如果体系结构超标量,则可能对应于甚至更多的提取指令。
当考虑如此大量的取指令时,即使挤压变得复杂,例如如果有一个我们不确定的值存储是正确的,会发生什么?如果我们遇到另一个分支等会怎么样?
此外,错误预测对应于性能方面的重大影响,因此使用Selective Replay和Value Prediction等更先进的技术来改善这种惩罚。