如何为这段代码创建无分支代码?

时间:2017-11-11 17:38:54

标签: compiler-construction computer-science compiler-optimization cpu-architecture micro-optimization

我需要为内部循环中的if语句生成无分支代码 if(i!= j)。我很困惑如何生成无分支代码。

  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;
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

比较在C ++中返回0(假)或1(真)。因此,您可以按如下方式转换最内层条件:

int condition = d < results[i] 
results[i] = d * condition + results[i] * !condition;

要在内循环中跳过i,只需在i及以后的arg中添加一个:

...
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;
}
...

较少比较的替代方案是将内循环分成两个循环:

for (int j = 0; j < i; j++) {
   ...
}
for (int j = i + i; j < n; j++) {
   ...
}

编辑:替换了复杂的增量/循环开始修改。

P.S。:优化选项可能是在局部变量中构建最小值并仅在内部循环后分配给结果[i]。

答案 1 :(得分:1)

如果我理解正确,您需要使用n n矩阵进行操作,但不包括对角线中的值,即:

X O O O
O X O O
O O X O
O O O X

您可以通过&#34;展开&#34;重新构建问题。像这样的矩阵:

. O O O
. . O O O
. . . O O O
. . . . O O O

然后你可以在内循环中纠正j

for (int i = 0; i < n; i++) {
    // ...
    for (int j = i + 1; j < i + n; j++) {
        d = myfunction(x, y, i, j % n);
        // ...
    }
}