位操作以避免分支错误预测

我在这个网站上发现了另一个关于分支预测失误的问题。 在答案中,给定的解决方案是替换if语句(分支),如下所示

const unsigned arraySize = 32768;
int data[arraySize];

for(int i = 0; i < arraySize; ++i)
    if (data[c] >= 128) // <- to be replaced
        sum += data[c];

与按位运算符。

int t = (data[c] - 128) >> 31;
sum += ~t & data[c];

因此,对于数据数组中的值大于或等于128的数值,t将为0.因此,t等于111 ... 1,因此按位与数据[c]保存该值。 但是, 如果数据数组中的值小于128,是不是等于1? 所以〜t应该是111 ... 0,但是我们不应该用数据[c]按位与 - 000 ... 0以不添加?

链接地址: http://www.djcxy.com/p/6203.html

上一篇: Bit manipulation to avoid branch mispredict

下一篇: Using bitwise operations