可移植的 C++ 分支预测提示

5

分支预测在StackOverflow上已经被讨论了几次。但是,我没有特别找到我正在寻找的答案。
在优化阶段,我需要避免分支错误预测。而且我需要做一些验证。看起来像:

if(!successCondition)
    { throw Something(); }

当然,在正常的预期工作流程中,大多数情况下我们不会抛出异常,因此也不会进入if语句。
我知道在常见的if/else范式中,我们可以通过将最可能的分支放在if中,较不可能的放在else中(可移植的分支预测提示)来提示编译器。但是为了可读性,我不想链接这些if语句。
if(successCondition)
    { whatever(); }
else
    { throw Something(); }

因此,我理解编译器默认会偏向于if语句中的条目,这将导致分支预测错误。
我知道gcc有一个特定的优化代码的函数,在Linux内核中称为unlikely(Branch-aware programming)。但是它不具备可移植性,而我需要我的代码具备可移植性。
在C++中是否有一种方式可以保持正确的分支预测并具备可移植性?

4
在大多数现代编译器上,您编写的这两个代码版本将产生相同的性能。答案中提供的断言(将条件反转会导致更高的性能)听起来像是某人没有对其代码进行过性能分析或检查其程序汇编结果的建议。 - Xirema
3
举例来说,在 这个示例 中,注意到颠倒 if-else 块的条件不会影响生成的汇编代码,即使任何观察者都可以轻松地看出在一个版本中 if 块的可能性较小,在另一个版本中 else 块的可能性较小。编译器对于这些类型的结构进行了积极优化,试图突破这种优化并不能使您的代码更快 - 只会让它更难以阅读。 - Xirema
@Xirema - 这确实是一个有趣的代码片段,它展示了编译器非常强大(GCC比我想象的要强大得多)。然而,我猜Linux开发人员在他们的代码中添加“likely”或“unlikely”关键字是有动机的。我确实同意我们应该避免过早优化,编译器通常非常好,硬件设计师倾向于努力避免分支预测错误(如果我没记错的话,现在使用感知器);但我仍然认为在某些情况下它可能是有用的。 - Emile D.
1个回答

7

C++20 很可能会为此目的引入属性。(委员会草案仍在审核中。)


2
它已经来了!https://en.cppreference.com/w/cpp/language/attributes/likely :) - Bamboo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接