什么是还原变量?有人能给我一些例子吗?

时间:2013-02-19 11:06:22

标签: variables llvm reduction

什么是还原变量?   谁能给我一些例子呢?

1 个答案:

答案 0 :(得分:8)

这是一个用C语言计算数组总和的简单例子:

int x = 0;
for (int i = 0; i < n; i++) {
    x += a[i];
}

在此示例中,

  • i是一个归纳变量 - 在每次迭代中它都会改变一些常量。它可以是+1(如上例所示)或*2/3等,但关键是在所有迭代中数字都相同。

    换句话说,在每次迭代i_new = i_old op constant中,op+*等,op和{{1}迭代之间的变化。

  • constant缩减变量 - 它将数据从一次迭代累积到下一次迭代。它总是有一些初始化(在这种情况下为x),虽然在每次迭代中累积的数据可能不同,但运算符保持不变。

    换句话说,在每次迭代x = 0中,x_new = x_old op data在所有迭代中保持不变(尽管op可能会更改)。

在许多语言there's a special syntax for performing something like this中 - 通常称为“折叠”或“缩小”或“累积”(并且还有其他名称) - 但在LLVM IR的上下文中,归纳变量将由phi节点在循环内的二进制操作和它之前的初始化值之间的循环中。

还原变量(例如加法)中的交换*运算对于优化编译器特别有意义,因为它们似乎在迭代之间显示出比实际更强的依赖性;例如,上面的例子可以被重写成一个矢量化的形式 - 一次添加4个数字,然后是一个小循环,将最终的矢量加到一个单独的值中。

*在应用这样的矢量化之前,实际上还有更多的条件需要缩减变量,但这实际上超出了范围