当前位置: 首页 > 知识库问答 >
问题:

c中的可移植分支预测提示

昌乐生
2023-03-14

分支预测已经在StackOverflow上讨论了几次。然而,我并没有具体找到我所寻找的答案
在优化阶段,我需要避免分支预测失误。我需要做一些验证。它看起来像:

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

当然,在正常的预期工作流中(大多数情况下都会发生),我们不会抛出异常,因此我们不会输入if。

我知道在常见的if/else范式中,我们可以通过将最可能的分支放在if中,将可能性较小的分支放在else中来提示编译器(可移植分支预测提示)。但是我不希望(因为可读性)链接if:

if(successCondition)
    { whatever(); }
else
    { throw Something(); }

因此,我理解编译器将默认支持 if 中的条目,并且我将获得分支错误预测。

我知道gcc有一个特定的函数来优化代码,这在Linux内核(分支感知html" target="_blank">编程)中是不太可能调用的。但是它是不可移植的,我需要我的代码是。

有没有一种方法可以在C语言中进行正确的分支预测,并保持可移植性?

共有1个答案

韶镜
2023-03-14

C 20,呃,很可能具有用于此目的的属性。(委员会草案仍在审查中。

 类似资料:
  • 如果语句更多地依赖于分支预测,而v表查找更多地依赖分支目标预测,那么

  • 分支目标预测(BTP)与分支预测(BP)不同。我知道BTP会找到分支将跳转到的位置,而BP只是决定可能采取哪个分支。 BTP依赖BP吗,如果BTP不使用BP来预测哪个分支被采用,它怎么可能知道分支的目标呢? 我不明白为什么会有这么大的差异?一旦分支被预测为被占用,找到目标并不像读取指令中的地址一样简单吗?

  • 编辑:我的困惑出现了,因为通过预测哪个分支,你肯定也在有效地进行目标预测?? 这个问题与我关于这个主题的第一个问题有内在联系: 分支预测与分支目标预测 无限循环 语句 或语句 语句的“then”子句结尾(跳过子句) 非虚函数调用 从函数返回 虚函数调用 函数指针调用 语句(如果编译为跳转表) 语句 语句(如果编译成一系列语句) 循环条件测试 和运算符 三元运算符 null 如果我有以下代码: (B

  • 我的代码经常调用具有多个(不可预测的)分支的函数。当我分析时,我发现这是一个小瓶颈,大部分CPU时间用于条件JMP。 考虑以下两个函数,其中原始函数有多个显式分支。 这是一个新函数,我试图在其中删除导致瓶颈的分支。 然而,当我分析新代码时,性能只提高了大约20%,而且调用本身(对mem_funcs数组中的一个func)花费了很长时间。 第二个变量仅仅是一个更隐含的条件吗,因为CPU仍然无法预测将要

  • WebAssembly的二进制格式是被设计成可在不同操作系统与指令集上高效执行的,无论在Web或非Web环境中。 对高效执行的设想 尽管执行环境是有条件的,本地的,不确定的,也不要向WebAssembly提供下述特性。有些情况下为了WebAssembly模块执行,也许不得不模拟一些宿主硬件或操作系统不提供的特性,让它们似乎被支持。这种情况将会导致糟糕的性能。 随着WebAssembly的标准化推进

  • 2.2.1.可移植性 Linux可以轻松地移植到各种不同的硬件平台上。有了Linux做硬件抽象层,Android就不必为不同硬件的兼容性而劳心。Linux 的绝大多数底层代码都是用可移植的 C 代码编写,因此第三方开发者可以将 Android 移植到很多不同的设备上。