理解分支预测

3

有一些关于分支预测的问题,我无法自信地解决。假设我必须使用静态分支预测。

  1. 分支预测应该在流水线的哪个阶段发生?
  2. 如何知道预测出现了错误?数据路径如何知道发生了错误预测?
  3. 如果它知道发生了错误预测,它如何发送信号以采取未采取的分支?
  4. 在它出现错误之后,我必须采取先前没有采取的地址。同时,如果发生了某些内存写入或寄存器写入,该怎么办?如何防止它发生?

即使提供一些带有数据路径的适当参考也将非常有帮助。提前致谢。


这里是ARMv8-A的参考手册链接:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html。只有注册用户才能访问。如果您感兴趣,我对PPC分支预测也有一些了解。只要说一声。 - Andreas
我知道如何访问参考手册。你对哪个 ARM 模型感兴趣吗? - Andreas
如果您拥有Cortex-A8... - Ankit Shubham
2个回答

2

我猜可能有许多不同的机制可供选择,以下是一些快速的回答:

  1. 分支预测必须在指令解码之前进行,在提取阶段。否则,你将解码不正确的指令。
  2. 通常,你会给出与预测分支指令相关的额外信息,如预测的目标。分支将被执行,如果实际目标与预测的目标不匹配,你需要清空流水线。
  3. 这真的取决于具体实现。如果分支被执行,你可以使用实际目标,就像未预测到的分支一样。
  4. 你肯定需要一个恢复机制,或者等待分支解决后再写入结果。这会浪费一些时间,但不会像未预测到的分支那样浪费时间。

1
我花了一些时间阅读Cortex-A8的参考手册:http://infocenter.arm.com/help/topic/com.arm.doc.ddi0344k/DDI0344K_cortex_a8_r3p2_trm.pdf 从5.1节中可以看出:
处理器包含程序流预测硬件,也称为分支预测。禁用程序流预测时,所有取出的分支都会产生13个周期的惩罚。启用程序流预测后,所有错误预测的分支都会产生13个周期的惩罚。
基本上这意味着静态分支预测总是假设分支为false。这与PowerPC不同,后者有“特殊指令”来提示处理器有关已取/未取分支的信息(后缀+/-)。
从1.3.1节中可以看出:
指令获取单元预测指令流,从L1指令高速缓存中获取指令,并将获取的指令放入缓冲区以供解码管道消耗。
第一阶段Instruction Fetch进行预测。

来自第7.6.2节:

指令可以在被获取和执行之间保留在流水线中。由于流水线中可能有几个未解决的分支,因此指令获取是投机的,这意味着不能保证它们会被执行。代码流中的分支或异常指令可能导致流水线刷新,丢弃当前获取的指令。开始时没有空的流水线的获取或指令表遍历被标记为投机。如果流水线到达分支和异常解析点之前包含任何指令,则认为流水线不为空。

我理解为在处理分支时,没有任何东西达到执行阶段。如果在指令执行中执行分支时发生了错误预测,则流水线中的所有指令都将“清除”。它们永远不会被执行。这应该回答了问题2和4。不太确定“标记”是如何执行的。

  1. 我不知道它如何发送信号。据我所知,参考手册没有涵盖那部分。猜想这是魔法。

(记录一下,我发现我习惯的PowerPC参考手册(e500/e600)更容易理解,因为有许多指令定时示例。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接