【发布时间】:2014-10-28 07:28:35
【问题描述】:
我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支吗?我最关心的是英特尔架构,但我可以从任何架构中学到任何东西。
【问题讨论】:
我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支吗?我最关心的是英特尔架构,但我可以从任何架构中学到任何东西。
【问题讨论】:
分支预测器的元数据存储在芯片上,在分支预测器表中。一些研究工作建议将它们存储在缓存层次结构中(称为predictor virtualization),但我认为它尚未在任何真正的处理器中实现。
由于您表示愿意了解更多信息,请参阅我的survey paper,了解有关多个分支预测器架构的更多详细信息。
【讨论】:
处理器内部的某个地方。具体做什么取决于处理器。
在一个非常简单的情况下,您可能需要 4096 位的分支预测数据。然后对于每个分支,您获取分支地址的最后 12 位,它给出 4096 个不同的值,并将其作为分支预测数据的索引。而且由于您只有一点数据,您只需存储是否采用了最后一个分支。
优点是非常便宜。缺点是正好相隔 4096 字节的两个分支使用表中的相同条目。因此,如果您的代码一直在执行这两个分支,并且始终采用一个,而从不采用一个,则分支预测非常糟糕。
某些处理器每个分支使用两位,表示“强采用”、“采用”、“未采用”、“强未采用”。每次采用分支时,预测都会向“强采用”方向移动,如果未采用分支,则预测会向“强未采用”方向移动。如果分支通常在极少数例外情况下采用,这会更好。
一些处理器不仅使用分支地址的最后 12 位或更多位,而且还会混合使用最后四个分支是否被采用。假设你有代码
if (x >= 0) { ... }
if (x <= 0) { ... }
并且 x 很少为 0,而是随机地为正或负。那么第一个分支很难预测,但是在第一个分支被取走之后,第二个分支永远不会被取走,如果第一个分支没有被取走,则总是被取走。通过混合这些信息,您会用完第二个分支的分支预测表中的两个条目,但第二个分支的预测将非常准确,即使该分支是随机采用或不采用的。
你总是会遇到分支预测表中的同一个条目会被用于多个分支的问题;你只是忍受它。 (做任何聪明的事情来处理这个会占用太多的存储空间。我们使用每个分支预测 1 或 2 位,所以我们可以用很少的存储空间拥有海量表)。
【讨论】: