5 compiler-construction computer-science cpu-architecture micro-optimization compiler-optimization
我需要为内部循环 if(i != j) 中的 if 语句生成无分支代码。我很困惑如何生成无分支代码。
for (int i = start; i < n; i++)
{
results[i] = 999;
for (int j = 0; j < n; j++)
{
if (i != j)
{
d = myfunction(x, y, i, j);
if (d < results[i])
results[i] = d;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 C++ 中,比较返回 0(假)或 1(真)。所以你可以将最里面的条件转换如下:
int condition = d < results[i]
results[i] = d * condition + results[i] * !condition;
Run Code Online (Sandbox Code Playgroud)
要跳过内循环中的 i,只需在 i 及之后的 arg 中添加 1:
...
for (int j = 0; j < n - 1; j++) {
d = myfunction(x, y, i, j + (j >= i));
int condition = d < results[i]
results[i] = d * condition + results[i] * !condition;
}
...
Run Code Online (Sandbox Code Playgroud)
比较次数较少的另一种选择是将内部循环分为两个循环:
for (int j = 0; j < i; j++) {
...
}
for (int j = i + i; j < n; j++) {
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:复杂增量/循环开始修饰被替换。
PS:优化选项可能是在局部变量中构建最小值并仅在内部循环之后分配给 results[i]。