我一直想知道预测数据存储在哪里/如何存储?有限制吗?它只是最近的分支机构吗?我最关心的是英特尔体系结构,但我对任何体系结构所能学到的东西都表示赞赏。
处理器内部的某个位置。具体做什么取决于处理器。
在一个非常简单的情况下,您可能需要4096位分支预测数据。然后,对于每个分支,取分支地址的最后12位,它给出4096个不同的值,并将其作为分支预测数据的索引。由于您只有一个数据位,您只需存储最后一个分支是否被占用。
优点是它非常便宜。缺点是两个相距4096字节的分支在表中使用相同的条目。因此,如果代码一直执行这两个分支,其中一个总是执行,另一个从不执行,那么分支预测就相当糟糕。
有些处理器每个分支使用两个比特,意思是"强取"、"取了"、"不取了"one_answers"强未取了"。每次采取分支时,预测都会向"采取有力"方向移动,如果不采取分支,则会向"不采取有力"移动。如果分支通常是在极少数例外情况下执行的,则效果会更好。
有些处理器不仅使用分支地址的最后12位或更多位,而且会混合使用最后四个分支。假设你有代码
if (x >= 0) { ... }
if (x <= 0) { ... }
x很少为0,而是随机地为正或负。然后第一个分支很难预测,但第二个分支在第一个分支被提取后永远不会被提取,如果第一个分支没有被提取,则总是被提取。通过混合这些信息,您可以使用第二个分支的分支预测表中的两个条目,但第二个支路的预测将非常准确,即使该支路是随机选取或不选取的。
您总是会遇到这样的问题,即分支预测表中的同一条目将用于多个分支;你就这样生活吧。(做任何巧妙的处理都会占用太多的存储空间。我们使用每个分支1或2位的预测,这样我们就可以用很少的存储空间来生成大量的表)。
分支预测器的元数据存储在芯片上的分支预测器表中。一些研究工作建议将它们存储在缓存层次结构中(称为预测虚拟化),但我认为它还没有在任何真正的处理器中实现。
由于您表示愿意了解更多信息,请参阅我的调查论文,以了解有关几个分支预测器架构的更多详细信息。