Intel 复杂代码和分支预测器

Intel 复杂代码和分支预测器,intel,branch-prediction,Intel,Branch Prediction,分支预测逻辑的“粘性”有多大?如果正在从指令缓存中删除代码,那么统计信息是否保留在指令缓存中 换句话说,如果代码很复杂或者不是成批处理,那么分支预测仍然有帮助吗 让我们假设英特尔服务器硬件比2011年更新。分支预测器的确切工作原理将因处理器而异。但几乎所有非平凡分支预测器都需要程序中分支的历史记录才能正常工作 此历史记录记录在分支历史记录缓冲区中 这些有多种口味。最常研究的两个问题是: 本地历史-跟踪每个分支的历史 全局历史记录-跟踪所有分支机构的组合历史记录 现代处理器将有多个用于不同用途

分支预测逻辑的“粘性”有多大?如果正在从指令缓存中删除代码,那么统计信息是否保留在指令缓存中

换句话说,如果代码很复杂或者不是成批处理,那么分支预测仍然有帮助吗


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

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

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

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

  • 本地历史-跟踪每个分支的历史
  • 全局历史记录-跟踪所有分支机构的组合历史记录
现代处理器将有多个用于不同用途的缓冲区。在所有情况下,缓冲区的大小都是有限的。所以,当他们的房间不够用时,一些东西需要被驱逐

英特尔和AMD都没有给出分支预测器的详细信息。但据信,两家公司目前的处理器可以跟踪数千家分支机构的历史


回到这一点,分支预测器使用的数据将“保持”在历史缓冲区中的时间。因此,如果代码很小且行为良好,不会溢出缓冲区,那么预测器的性能最好

  • 如果大部分计算花费在少量代码中,本地历史缓冲区将能够跟踪所有通常被命中的分支
  • 如果计算到处都是,分支预测器可能有太多的分支无法跟踪,因此其性能将下降
请注意,指令和uop缓存虽然独立于分支预测器,但将显示相同的效果。因此,在试图构建测试用例和基准来研究其行为时,可能很难单独选择分支预测器


因此,这是性能方面的另一种情况,具有局部性具有优势。

随着Intel调整其算法/硬件,甚至可能从一步一步调整到另一步,每个处理器的性能可能会有所不同。我也很确定英特尔不会透露其分支预测器背后的细节,因为分支预测器的性能是整个处理器性能的一个重要组成部分,我认为这是一个严密保密的秘密。指令缓存不应该与之有任何关系。有一个“缓存”专门用来存储分支及其历史记录。因此,它可以跟踪(数千?)不同的分支。除非你超出了这个范围,否则可能不会有任何问题。请不要用不相关的标签来标记问题。这个问题是关于英特尔处理器内部的。它与Java无关。@神秘的是,这是一个答案吗?还应该注意的是,最常见的分支历史缓冲区的设计方式是,一个分支可能有多个条目,基于它遇到的历史上下文,因此,实现预测器溢出而指令/uop缓存不受压力的场景并不罕见或困难——只需使用具有复杂模式(或根本没有模式)的小代码占用