使用可能/不太可能的提示是否有任何性能测试结果?

时间:2011-09-30 08:44:49

标签: c++ c optimization gcc micro-optimization

gcc feature likely/unlikely hints帮助编译器生成具有更好分支预测的机器代码。

是否有关于如何正确使用或未使用这些提示影响某些实际系统上实际代码性能的数据?

3 个答案:

答案 0 :(得分:4)

问题有所不同,但Peter Cordes's answer上的this question给出了明确的提示;)。现代CPU忽略静态提示并使用动态分支预测。

答案 1 :(得分:1)

我不知道对这些特殊提示有任何透彻的分析。在任何情况下,它都将特定于CPU。一般而言,如果您确定可能性(例如,> 90%),那么添加此类注释可能是值得的,尽管具体用例的改进会有很大差异。

现代桌面CPU往往具有非常好的分支预测。如果您的代码无论如何都在热门路径上,动态分支预测器将很快发现分支本身存在偏差。如果没有可用的动态分支信息,这些提示主要用于帮助启动静态预测器。

在x86上,静态预测器预测前向分支被采用并且后向分支被采用(因为它们通常表示循环)。因此,编译器将调整静态代码布局以匹配预测。 (这也可能有助于将热路径放在相邻的缓存行上,这可能会有所帮助。)

在PPC上,一些跳转指令有一点可以预测它们的可能性。我不知道编译器是否也会重新安排代码。

我不知道ARM CPU如何预测分支。作为低功耗设备,它可能具有不太复杂的分支预测,静态预测可能会产生更大的影响。

答案 2 :(得分:0)

可能/不太可能通过向ICache预载分支程序代码来暗示工作,该分支程序代码通常被程序员认为是正确的。就分支预测器而言,本质上依赖于有限的历史数据,它仅在循环(或小型代码库)中有效,并且就分支性能而言,循环并不总是问题(例如,在实时仿真或游戏中) ,其中需要以很高的速率处理大量对象的大量模拟/游戏逻辑。在这种情况下,分支预测器无法有效运行,这对于sim开发人员来说是一个严重的性能问题。这种逻辑实际上可以由每帧成千上万个不同的,非重复的条件组成,完全使分支预测器无法有效运行。

为回答原始问题,编译器倾向于在生成代码以预加载Icache时假设条件将为false。您应该检查代码中的程序集输出以进行验证,然后,如果您不想构造代码以适合特定的处理器体系结构,则可以为要以高性能方式预加载的条件编写宏。

一些研究估计,现代游戏引擎在现代处理器上会将60%至80%的时间用于高速缓存未命中,分支错误预测大约占这些未命中的15%。为了适应现代游戏引擎,分支预测器将需要整个游戏逻辑框架的历史数据-每个管道可能涉及数MB的数据。