如何为这段代码创建无分支代码?
How to create branchless code for this piece of code?
我需要为内循环中的 if 语句生成无分支代码
如果(我!= 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;
}
}
}
如果我没理解错的话,你需要对一个n
by n
矩阵进行运算,但不包括对角线上的值,即:
X O O O
O X O O
O O X O
O O O X
您可以通过 "unrolling" 矩阵重新构建问题,如下所示:
. 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);
// ...
}
}
C++ 中的比较 returns 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]。
我需要为内循环中的 if 语句生成无分支代码 如果(我!= 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;
}
}
}
如果我没理解错的话,你需要对一个n
by n
矩阵进行运算,但不包括对角线上的值,即:
X O O O
O X O O
O O X O
O O O X
您可以通过 "unrolling" 矩阵重新构建问题,如下所示:
. 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);
// ...
}
}
C++ 中的比较 returns 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]。