gpt4 book ai didi

c++ - 在C++中,分支预测器是否预测隐式条件语句?

转载 作者:行者123 更新时间:2023-12-01 15:12:29 25 4
gpt4 key购买 nike

在这段代码中,它被写成result += runs[i] > runs[i-1];,一个隐式条件语句。在C++中,分支预测器是否对此语句进行预测?还是我必须显式地使用if关键字来进行分支预测?

using namespace std; 
int progressDays(vector<int> runs) {
if (runs.size() < 2) {return 0;}
int result = 0;
for (int i = 1; i < runs.size(); i++) {result += runs[i] > runs[i-1];}
return result;
}

最佳答案

CPU不直接运行C++,而是运行机器代码。因此答案取决于您的C++如何编译为汇编代码/机器代码。 您在C++中表示程序逻辑的选择仅间接影响这一点。现代的编译器可以并将C++ if()语句转换为无分支的asm(也称为无分支)。 (对于GCC,在-O3上比在-O2上做得更加积极-参见gcc optimization flag -O3 makes code slower than -O2)
在大多数体系结构中,有许多种有效的方法可以将比较结果直接直接转换为0或1整数。 (或者以另一种方式无分支地递增,或者甚至更直接地递增,例如AArch64's csinc / csel / cinc指令,该指令进行条件增量,读取输入寄存器和标志。 因此,通常将x < y用作整数值可以进行无分支编译。

int conditional_inc(int x, int y, int z) {
z += (x<y);
return z;
}
例如 on the Godbolt compiler explorer
# x86-64 clang -O3
conditional_inc(int, int, int)
xor eax, eax # prepare a zeroed register for setl of the low byte, to extend to 32-bit. (x86 is annoyingly clunky and inefficient at this)
cmp edi, esi
setl al # EAX = AL = (x<y) signed compare
add eax, edx # EAX += z in the retval register
ret
AArch64的效率更高,合并的增量和选择指令替代了xor-zero / setcc / add。
conditional_inc(int, int, int):
cmp w0, w1 // compare
cinc w0, w2, lt // use the flags result, and the other 2 inputs.
ret

所有这些,如x86-64 setcc 一样,都是ALU指令,不是控制(程序计数器无条件更改),因此具有数据依赖性而不是控制依赖性,因此不需要分支预测,因为没有分支。 (最著名的此类指令可能是x86 cmovcc,但在这种情况下,只需要 setcc即可)
  • Is CMOVcc considered a branching instruction?
  • Why is a conditional move not vulnerable for Branch Prediction Failure?显示了一个使用cmov有条件地递增的asm示例。

  • 通常,比较与分支是分开的。您可以比较,然后获得不分支的 bool(boolean) 值。 (分支确实需要分支,但这可以是对整数或 bool(boolean) 值零的隐式比较。)
    因此 不是条件语句,它只是一个 bool(boolean) 值,用作整数。

    关于c++ - 在C++中,分支预测器是否预测隐式条件语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63145211/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com