分支预测和分支目标预测之间的性能差异

Performance difference between branch prediction and branch target prediction?

本文关键字:性能 之间 分支 目标 分支预测      更新时间:2023-10-16

我正在编写一些音频代码,其中基本上所有内容都是一个小循环。据我所知,分支预测失败是一个足够大的性能问题,我很难保持代码分支的自由。但我只能走这么远,这让我想知道不同种类的分支。

在c++中,固定目标的条件分支:

int cond_fixed(bool p) {
if (p) return 10;
return 20;
}

并且(如果我正确理解这个问题的话),到可变目标的无条件分支:

struct base {
virtual int foo() = 0;
};
struct a : public base {
int foo() { return 10; }
};
struct b : public base {
int foo() { return 20; }
};
int uncond_var(base* p) {
return p->foo();
}

是否存在性能差异在我看来,如果这两种方法中的一种明显比另一种快,编译器只需转换代码即可匹配。

对于分支预测非常重要的情况,了解哪些有关性能的详细信息是有用的

EDITx : 10 ? 20的实际操作只是一个占位符。分支之后的实际操作至少足够复杂,以至于两者都做是低效的。此外,如果我有足够的信息来合理地使用__builtin_expect,那么在这种情况下,分支预测将不是问题。

附带说明:如果您有类似的代码

if (p) a = 20; else a = 10;

那么就没有任何分支了。编译器正在使用条件移动(请参阅:为什么条件移动不易受到分支预测失败的攻击?)

您没有提到您的编译器。我曾经将GCC用于一个性能关键型应用程序(实际上是我所在大学的一场竞赛),我记得GCC有__builtin_expect宏。我检查了代码中的所有条件,最终获得了5-10%的加速,我发现这很神奇,因为我几乎注意到了我所知道的一切(内存布局等),而且我没有改变任何关于算法本身的事情。

顺便说一下,该算法是一个相当基本的深度搜索。我在Core 2 Duo上运行了它,但不确定是哪一个。