我一直想知道预测数据的存储位置和方式?有限制吗?它只是最近的分支吗?我主要关心的是英特尔架构,但我对任何架构的了解都表示赞赏.
处理器内部的某处.究竟做了什么取决于处理器.
在一个非常简单的情况下,您可能需要4096位分支预测数据.然后对于每个分支,您获取分支地址的最后12位,这将提供4096个不同的值,并将其作为分支预测数据的索引.由于您只有一位数据,因此您只需存储最后一个分支是否已被占用.
优点是它非常便宜.缺点是两个分支恰好相隔4096个字节使用表中的相同条目.因此,如果您的代码始终执行这两个分支,并且始终采用一个分支,而从不采用一个分支,则分支预测非常糟糕.
一些处理器每个分支使用两个比特,意思是"强烈采取","采取","不采取","强不采取".每次采取分支时,预测都会向"强烈采取"移动,如果不采取分支,则向"强烈未采取"移动.如果分支通常采用极少数例外情况,则效果会更好.
有些处理器不只是使用分支地址的最后12位或更多位,而是混合使用是否说最后四个分支.说你有代码
if (x >= 0) { ... }
if (x <= 0) { ... }
Run Code Online (Sandbox Code Playgroud)
并且x很少为0,但是非常随机的正面或负面.然后第一个分支很难预测,但第二个分支在第一个分支被采取之后永远不会被采取,并且如果不采用第一个分支则总是采取.通过混合此信息,您可以在分支预测表中使用第二个分支中的两个条目,但是第二个分支的预测将是高度准确的,即使分支是随机选取的也不是.
总是存在这样的问题:分支预测表中的相同条目将用于多个分支; 你就是这样生活的.(做任何聪明的处理都会占用太多的存储空间.我们每个分支预测使用1或2位,因此我们可以使用非常少的存储空间来存储大量表).