【问题标题】:Complex code and branch predictors复杂代码和分支预测器
【发布时间】:2014-07-31 19:50:32
【问题描述】:

分支预测器逻辑有多“粘”?如果代码正在从指令缓存中删除,统计信息会保留吗?

换句话说,如果代码很复杂或者没有批量处理,分支预测还有帮助吗?

假设 Intel 服务器硬件比 2011 年更新。

【问题讨论】:

  • 随着英特尔调整其算法/硬件,可能会因处理器而异,甚至可能因步进而异。我也很确定英特尔不会透露其分支预测器背后的细节,因为分支预测器性能是整体处理器性能的重要组成部分,我想这将是一个严密保密的秘密。
  • 指令缓存不应该与它有任何关系。有一个“缓存”专门用于存储分支及其历史记录。所以它可以跟踪(数千个?)不同的分支。除非您超出该问题,否则可能不会有任何问题。
  • 请不要用不相关的标签标记问题。这个问题是关于英特尔处理器内部的。它与 Java 无关。
  • @Mysticial 这是一个答案吗?

标签: intel branch-prediction


【解决方案1】:

分支预测器的确切工作方式因处理器而异。但几乎所有非平凡的分支预测器都需要程序中的分支历史记录才能发挥作用。

这段历史记录在分支历史缓冲区中。

这些有多种口味。最常研究的两个是:

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

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

英特尔和 AMD 均未提供有关其分支预测器的详细信息。但据信,两家公司的当前处理器可以跟踪数千个分支机构及其历史记录。


回到正题,分支预测器使用的数据将“粘”在历史缓冲区中。因此,如果代码足够小且表现良好,不会超出缓冲区,则预测器的性能最佳。

  • 如果大部分计算花费在少量代码上,本地历史缓冲区将能够跟踪所有经常被命中的分支。
  • 如果计算遍布各处,分支预测器可能无法跟踪的分支过多,从而导致其性能下降。

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

所以这是另一个在性能方面具有优势的案例。

【讨论】:

  • 还应该注意,最常见的分支历史缓冲区的设计方式,单个分支可能有多个条目,基于它遇到的历史上下文,所以实现一个并不少见或难以实现预测器溢出而指令/uop 缓存没有受到压力的场景 - 只需使用具有复杂模式(或根本没有模式)的小代码占用空间
猜你喜欢
  • 2018-07-02
  • 2015-11-24
  • 2012-12-10
  • 2013-04-02
  • 2014-04-25
  • 2014-03-03
  • 2015-02-21
  • 2016-09-14
  • 2016-07-01
相关资源
最近更新 更多