分支预测

时间:2012-12-23 18:31:55

标签: assembly micro-optimization

  

可能重复:
  Is it possible to tell the branch predictor how likely it is to follow the branch?

因此,如果分支预测起着如此重要的作用(“分支预测器在许多现代流水线微处理器体系结构(如x86)中实现高效性能方面发挥着关键作用。” wiki ) ,有必要有一种方法来优化和帮助它,对吗?

我会以一种简单的方式问我的问题:
你能告诉分支机构预测你最有可能选择哪条路线吗?

我将提供一个例子:

如果这是用户第一次运行,我的程序会在每次加载时进行检查。 很可能应该缓存的分支是标记为“它不是第一次”的分支。

在这个例子中,这不是什么大问题,也许算法可以找出要采取的路线,但在具有大量分支的复杂应用中,我不太确定算法会得到10分中的10分。

我们能以某种方式优化吗?也许标记一个分支缓存?
顺便提一下,我正在寻求教育目的,也许有一天需要时间关键的课程。

4 个答案:

答案 0 :(得分:2)

  

这是为了C.我要求ASM

这意味着您必须自己实现__builtin_expect的语义。这并不难,只是尴尬。如果分支预测器没有分支的历史记录,那么它将假设分支在分支向后时被分支,而在分支向前时不被分支。

因此,您可能必须使用分支指令中的相反条件重构代码,并移动代码以适应该条件。带条件反向分支的无条件前向跳转很常见,例如C编译器实现for()循环的方式。

答案 1 :(得分:2)

“如果需要分支提示,可以在分支指令之前添加以下指令前缀,以更改静态预测器的行为方式: 0x3E - 静态预测分支采取的 0x2E - 静态预测分支未被采取“

http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts

答案 2 :(得分:1)

最简单的启发式方法是使用与最常见路径匹配的分支指令。例如,如果您正在编写循环,通常最好让分支指令遵循循环路径而不是退出条件。目标是使用最频繁评估为真的分支指令。

如果您选择了完全错误的指令,假设您编写的循环几乎总是立即退出,则处理器可以缓存该分支的意义向后并调整其预测。但是,只有在使用频繁的代码时才会发生这种情况。

答案 3 :(得分:1)

一些重要的装配分支预测优化,来源:wiki

当预测分支时,在取指令时存在一个周期的停顿。因此,结构代码是最有可能的,因此最可能的代码路径是不采用分支的代码路径。

无条件分支可能被错误预测,并且分支之后的加载指令可能被解码并导致高速缓存访​​问。避免在分支之后放置加载指令,除非您打算CPU预取它们引用的地址。

尽管指令是成对解码的,但分支预测器只能预测每个周期的一个分支目标。如果您有一个条件分支,后面紧跟另一个分支,并且可能会采用第一个分支,则在分支之间放置一个无操作指令,以防止解码和预测第二个分支。如果不经常采用第一个分支,则插入NOP是有害的。