分支预测逻辑有多"粘" ?如果代码从指令缓存中删除,那么统计信息是否会保留?
换句话说,如果代码很复杂或者不能批量处理,分支预测还会有帮助吗?
让我们假设英特尔服务器硬件更新于2011年。
分支预测器的确切工作原理因处理器而异。但是,几乎所有重要的分支预测器都需要程序中分支的历史记录才能发挥作用。
此历史记录记录在分支历史缓冲区中。
这些有多种口味。最常被研究的两个是:
- Local History -跟踪每个分支的历史。
- Global History -跟踪所有分支的合并历史。
现代处理器将有多个缓冲区用于不同的目的。在所有情况下,缓冲区的大小都是有限的。因此,当它们用完空间时,的一些将需要被驱逐。
英特尔和AMD都没有给出他们分支预测的细节。但据信,两家公司目前的处理器可以追踪到数千家分行及其历史记录。
言归正传,分支预测器使用的数据将"保留"到历史缓冲区中。因此,如果代码足够小且行为良好,不会溢出缓冲区,则预测器的性能最好。
- 如果大部分计算花在少量代码上,本地历史缓冲区将能够跟踪所有经常被击中的分支。
- 如果计算到处都是,分支预测器可能有太多分支要跟踪,因此它的性能会下降。
所以这是另一个在性能方面具有局部性优势的例子。