当具有带有重排序缓冲区(ROB)和分支推测的无序执行处理器时,我知道在ROB执行提交之前不会进行更改。
功能单元(FU)的结果将结果写入公共数据总线(CDB)和完成执行时的ROB上。然后,ROB可以判断分支是否成功预测,如果是,则提交否则ROB被刷新。
我不明白的是,如果没有以某种方式刷新/回滚来自FU的CDB广播的保留站更新会发生什么?
我能做的一个例子(可能不是最好的)
addi $s1, $zero, 8
addi $s2, $zero, 9
addi $s3, $zero, 0
bneq $s1, $s2, L1
addi $s3, $s3, 1 // first increment
L1:
addi $s3, $s3, 2 // second increment
$ s3初始化为0, 然后对分支的错误预测导致$ s3增加1.结果被广播给RS。
$ s3现在准备开始执行第二个增量2.同时检测到分支未命中预测并刷新ROB,但是加法器的RS没有改变,所以$ s3现在有了一个错误的值,并且从未在ROB中被刷新。
这是如何解决的?
我怀疑我错过了一些至关重要的东西,我不是很有经验,我刚刚毕业并在修改时提出了这个问题。
答案 0 :(得分:0)
当预测分支被采用时,对$s3
(第一个增量)的更新将不会更新实际的寄存器$s3
,该数据将在重排序缓冲区中进行缓冲。当检测到错误预测时,将刷新重新排序缓冲区。无论如何,根据我的知识,底线是原始寄存器在分支解析之前不会更新,因此使用重新排序缓冲区。
答案 1 :(得分:0)
据我所知,至少在英特尔CPU上,ROB跟踪流水线无序部分内的所有飞行指令,包括仍在RS中等待执行的指令。因此,当ROB和RS发送到核心的无序部分时,它们将被添加到ROB和RS中。
我认为这种设计几乎是普遍的。你是对的,你需要能够跟踪每一个仍然以某种方式推测的指令。
此外,所有发现错误推测的依赖于指令的指令都需要刷新。如你所描述的那样冲洗整个ROB肯定更容易,并回到最后一个非投机状态。
所以即使第二个添加仍然需要执行,错误推测意味着它的输入可能是错误的。所以它需要刷新,以避免你正在谈论的问题。