有些关于分支预测的查询我无法自信地解决。假设我必须使用一个静态分支预测器。
- 分支预测应该发生在管道的哪个阶段
- 如何知道预测出了问题?数据路径是如何知道发生了预测错误的
- 如果它知道发生了预测错误,它如何发送信号来占用未占用的分支
- 出了问题之后,我必须使用之前没有使用的地址。与此同时,如果发生了内存写入或寄存器写入,该怎么办?如何防止这种情况发生
即使建议了一些带有数据路径的适当引用,这也会非常有帮助。提前谢谢。
我想有很多不同的机制是可能的,但有一些快速的答案:
- 分支预测当然需要在指令解码之前,在提取阶段进行。否则,您将解码不正确的指令
- 您通常会在预测的分支指令中提供额外的信息,就像预测的目标一样。将执行分支,如果实际目标与预测目标不匹配,则需要冲洗管道
- 这实际上取决于实施情况。如果执行了分支,则可以使用真正的目标,就像未预测的分支一样
- 当然,您需要一种机制来恢复,或者等待分支得到解决,直到编写结果。这将在一段时间内松动,但不会像一个未预测的分支那样松动
我花时间阅读了Cortex-A8的参考手册:http://infocenter.arm.com/help/topic/com.arm.doc.ddi0344k/DDI0344K_cortex_a8_r3p2_trm.pdf
来自第5.1节:
处理器包含程序流预测硬件,也称为分支预测。禁用程序流预测时,全部采取分支会受到13个周期的惩罚。具有程序流预测如果启用,所有预测失误的分支都会受到13个周期的惩罚。
基本上,这意味着静态分支预测总是假设分支为假。与PowerPC相比,这是不同的,PowerPC具有"特殊指令",用于向处理器提示已执行/未执行的分支(后缀+/-)。
来自第1.3.1节:
指令获取单元预测指令流,获取来自L1指令缓存的指令,并将提取的指令进入缓冲器以供解码流水线消耗。
- 指令获取,第一阶段,进行预测
来自第7.6.2节:
指令可以保留在获取和正在执行。因为中可能有几个未解决的分支流水线,指令获取是推测性的,这意味着不能保证它们被执行。分支或例外代码流中的指令可能会导致流水线刷新,从而丢弃当前获取的指令。获取或指令标记了在没有空管道的情况下开始的表遍历投机的如果管道包含的任何指令分支点和异常解析,则管道为被认为不是空的。
我将其解释为在处理分支时,没有任何东西到达执行阶段。如果发生错误编辑,如在执行指令执行中的分支时发现的,则管道中的所有指令都将被"刷新"。他们从未被处决。这应该回答问题2和4。不太确定"标记"是如何执行的。
- 我不知道它是如何发出信号的。据我所知,参考手册没有涵盖这一部分。我猜这很神奇
(为了记录在案,我发现PowerPC参考手册(e500/e600)由于有许多指令时序示例,我习惯于更容易理解。)