我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支吗?我最关心的是英特尔架构,但我能从任何架构中学到的任何东西都会受到赞赏。
2 回答
处理器内部的某个地方。具体做什么取决于处理器。
在一个非常简单的情况下,您可能需要 4096 位的分支预测数据。然后对于每个分支,您获取分支地址的最后 12 位,它给出 4096 个不同的值,并将其作为分支预测数据的索引。而且由于您只有一点数据,您只需存储是否采用了最后一个分支。
优点是非常便宜。缺点是正好相隔 4096 字节的两个分支使用表中的相同条目。所以如果你的代码一直在执行这两个分支,一个总是被采用,一个从不被采用,那么分支预测就很糟糕了。
一些处理器每个分支使用两位,表示“强采用”、“采用”、“未采用”、“强未采用”。每次采用分支时,预测都会朝着“强采用”的方向移动,如果没有采用分支,则预测会朝着“未采用强”的方向移动。如果分支通常在极少数例外情况下采用,这会更好。
一些处理器不仅使用分支地址的最后 12 位或更多位,而且它们混合了是否使用最后四个分支。说你有代码
if (x >= 0) { ... }
if (x <= 0) { ... }
x 很少为 0,而是随机地为正或负。那么第一个分支很难预测,但是在第一个分支被取走之后,第二个分支永远不会被取走,如果第一个分支没有被取走,则总是被取走。通过混合这些信息,您会用完第二个分支的分支预测表中的两个条目,但第二个分支的预测将非常准确,即使该分支是随机采用或不采用的。
您总是会遇到分支预测表中的同一条目将用于多个分支的问题;你只是忍受它。(做任何聪明的事情来处理这个会占用太多的存储空间。我们使用每个分支预测 1 或 2 位,因此我们可以拥有大量表而存储空间非常少)。