我一直想知道预测数据的存储位置和方式?有限制吗?它只是最近的分支吗?我主要关注的是英特尔架构,但我对任何架构的了解都很感激。
答案 0 :(得分:6)
处理器内部的某处。究竟做了什么取决于处理器。
在一个非常简单的情况下,您可能需要4096位分支预测数据。然后对于每个分支,您获取分支地址的最后12位,这将提供4096个不同的值,并将其作为分支预测数据的索引。由于您只有一位数据,因此您只需存储最后一个分支是否已被占用。
优点是它非常便宜。缺点是两个分支恰好相隔4096个字节使用表中的相同条目。因此,如果您的代码始终执行这两个分支,并且始终采用一个分支,而从不采用一个分支,则分支预测非常糟糕。
某些处理器每个分支使用两位,意味着"强烈采取","采取","未采取","强不采取" 。每次进行分支时,预测都会朝着强大的方向移动,如果没有采取分支,它就会朝着强大的方向移动"强烈的未被采取"。如果分支通常采用极少数例外情况,则效果会更好。
有些处理器不会只使用分支地址的最后12位或更多位,但它们会混合使用是否说最后四个分支。假设你有代码
if (x >= 0) { ... }
if (x <= 0) { ... }
和x很少为0,但非常随机为正或负。然后第一个分支很难预测,但第二个分支在第一个分支被采取之后永远不会被采取,并且如果不采用第一个分支则总是采取。通过混合此信息,您可以在分支预测表中使用第二个分支中的两个条目,但是第二个分支的预测将是高度准确的,即使分支是随机选取的也不是。
您总是遇到分支预测表中的相同条目将用于多个分支的问题;你就是这样生活的。 (做任何聪明的事情都需要处理太多的存储空间。我们每个分支预测使用1或2比特,因此我们可以使用非常少的存储空间来存储大量表)。
答案 1 :(得分:2)
分支预测变量的元数据存储在分支预测器表中的片上。一些研究工作建议将它们存储在缓存层次结构中(称为predictor virtualization),但我认为它还没有在任何真正的处理器中实现。
由于您表示愿意了解更多信息,请参阅我的survey paper以获取有关多个分支预测变量的体系结构的更多详细信息。