Linux内核:likely() vs unlikely()

19 浏览
0 Comments

Linux内核:likely() vs unlikely()

这两种方法在Linux内核代码中似乎被广泛使用。我了解分支预测的基本原理,但我想知道这两个函数如何影响if()语句的运行。它们是在CPU指令流水线的级别上工作吗?还是在内核代码级别上更高层次的抽象?作为一个刚开始接触Linux内核的人,我对了解这两种方法的内部工作方式非常感兴趣。谢谢!

0
0 Comments

在一些(微)架构中,编译器可以将分支提示编码到指令中,告诉CPU分支预测单元该分支可能会被执行。

在其他架构中,分支预测单元的静态部分被充分记录,可以用它来生成更快的代码。

例如,在大多数现代x86架构中,前向分支被静态预测为不会被执行,而后向分支被预测为会被执行(以加快循环速度)。

最终,预测性缓存获取可能更重要以提高速度。这主要取决于程序员,但对于指令缓存来说,如果编译器知道程序的哪部分可能会被执行,并且将该部分保持足够小以适应缓存,那么这可以帮助提高效率。

据我所知,自从P4以来,英特尔就没有再使用静态分支预测提示了...

我认为我足够小心地说了显式的分支提示并不常见。然而,当CPU首次遇到分支时,它必须猜测。通常情况下,第一次遇到的前向分支不会被预测为执行,而后向分支会被预测为执行。对于现代的微架构来说,这一点仍然成立。

0