4

什么是减少变量?谁能给我一些例子?

4

1 回答 1

9

下面是一个用类 C 语言计算数组和的简单示例:

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

在这个例子中,

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

    换句话说,在每次迭代i_new = i_old op constant中,where opis +*等,并且在迭代之间既不op也不constant变化。

  • x是一个归约变量- 它从一次迭代到下一次迭代累积数据。它总是有一些初始化(x = 0在这种情况下),虽然每次迭代累积的数据可能不同,但操作符保持不变。

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

在许多语言中,有一种特殊的语法来执行这样的事情——通常称为“折叠”或“减少”或“累积”(它还有其他名称)——但在 LLVM IR 的上下文中,归纳变量将表示为循环中的 phi 节点,位于循环内部的二元运算与其之前的初始化值之间。

减少变量(例如加法)中的交换*操作对于优化编译器来说特别有趣,因为它们似乎在迭代之间显示出比实际情况更强的依赖性;例如,上面的示例可以重写为向量化形式——例如,一次添加 4 个数字,然后是一个小循环,将最终向量求和为单个值。

* 实际上,在可以应用这样的矢量化之前,减少变量必须满足更多条件,但这确实超出了这里的范围

于 2013-02-19T12:24:44.870 回答