我被告知代码中的分支
int value = //some number;
if(value > some_other_value)
value *= 23;
else
value -= 5;
Run Code Online (Sandbox Code Playgroud)
可以通过按位掩码消除(为了启用代码的SIMD优化):
const int Mask = (some_other_value-value)>>31;
value = ((value * 23)&Mask)|((value-5)&~Mask);
Run Code Online (Sandbox Code Playgroud)
但是,我不明白这是如何工作的(尽管我理解这里使用的是什么操作以及结果在二进制中看起来如何).此外,这一般如何适用?如果原始代码是相似的,那该怎么办?
if(value & 1 == 1)
value *= 23;
else
value -= 5;
Run Code Online (Sandbox Code Playgroud)
分支删除的代码是否仍然相同?否则,面具的目的是什么,我应该如何创建呢?这里发生了什么?
这有效:
const int Mask = (some_other_value-value)>>31;
value = ((value * 23)&Mask)|((value-5)&~Mask);
Run Code Online (Sandbox Code Playgroud)
Mask 成为 - 的符号位,some_other_value - value类似于:
if (value > some_other_value) mask = -1; else mask = 0;
Run Code Online (Sandbox Code Playgroud)
您可以使用第二个示例实现相同的目标,使用:
mask = -(value & 1);
Run Code Online (Sandbox Code Playgroud)
因此,-0 = 0,-1 = 全 1。
编辑:我还要记住,如果计算变得太复杂,您将不会比分支版本获得任何东西,特别是如果分支可以合理预测的话。