有一些关于分支预测的问题,我无法自信地解决。假设我必须使用静态分支预测。
- 分支预测应该在流水线的哪个阶段发生?
- 如何知道预测出现了错误?数据路径如何知道发生了错误预测?
- 如果它知道发生了错误预测,它如何发送信号以采取未采取的分支?
- 在它出现错误之后,我必须采取先前没有采取的地址。同时,如果发生了某些内存写入或寄存器写入,该怎么办?如何防止它发生?
即使提供一些带有数据路径的适当参考也将非常有帮助。提前致谢。
有一些关于分支预测的问题,我无法自信地解决。假设我必须使用静态分支预测。
- 分支预测应该在流水线的哪个阶段发生?
- 如何知道预测出现了错误?数据路径如何知道发生了错误预测?
- 如果它知道发生了错误预测,它如何发送信号以采取未采取的分支?
- 在它出现错误之后,我必须采取先前没有采取的地址。同时,如果发生了某些内存写入或寄存器写入,该怎么办?如何防止它发生?
即使提供一些带有数据路径的适当参考也将非常有帮助。提前致谢。
我猜可能有许多不同的机制可供选择,以下是一些快速的回答:
来自第7.6.2节:
指令可以在被获取和执行之间保留在流水线中。由于流水线中可能有几个未解决的分支,因此指令获取是投机的,这意味着不能保证它们会被执行。代码流中的分支或异常指令可能导致流水线刷新,丢弃当前获取的指令。开始时没有空的流水线的获取或指令表遍历被标记为投机。如果流水线到达分支和异常解析点之前包含任何指令,则认为流水线不为空。
我理解为在处理分支时,没有任何东西达到执行阶段。如果在指令执行中执行分支时发生了错误预测,则流水线中的所有指令都将“清除”。它们永远不会被执行。这应该回答了问题2和4。不太确定“标记”是如何执行的。
(记录一下,我发现我习惯的PowerPC参考手册(e500/e600)更容易理解,因为有许多指令定时示例。)