复杂的代码和分支预测器

Mic*_*uff 4 intel branch-prediction

分支预测逻辑有多"粘性"?如果从指令缓存中删除代码,统计数据是否保持不变?

换句话说,如果代码很复杂或者没有批量处理,那么分支预测是否会有所帮助?

让我们假设商品英特尔服务器硬件比2011年更新.

Mys*_*ial 7

分支预测器的确切工作方式因处理器而异.但几乎所有非平凡的分支预测器都需要程序中分支的历史才能运行.

此历史记录记录在分支历史记录缓冲区中.

它们有多种口味.最常研究的两个是:

  • 本地历史 - 跟踪每个分支的历史.
  • 全球历史 - 跟踪所有分支的组合历史.

现代处理器将有多个缓冲区用于不同目的.在所有情况下,缓冲区的大小都是有限的.因此,当他们用完房间时,需要逐出某些东西.

英特尔和AMD都没有提供有关其分支预测器的详细信息.但据信,两家公司目前的处理器可以追踪数千个分支及其历史.


回到这一点,分支预测变量使用的数据只要保留在历史缓冲区中就会"坚持".因此,如果代码很小并且表现良好足以不超出缓冲区,则预测变量的性能最佳.

  • 如果大部分计算花费在少量代码上,则本地历史缓冲区将能够跟踪通常被命中的所有分支.
  • 如果计算到处都是,则分支预测器可能有太多分支要跟踪,因此其性能会降低.

请注意,指令uop缓存虽然独立于分支预测器,但会表现出相同的效果.因此,在尝试构建测试用例和基准以研究其行为时,可能难以挑出分支预测器.

所以这是性能中的另一个案例,其中具有局部性具有优势.