什么是减少变量?
谁能给我一些例子?
最佳答案
这是一个类似 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
也不是 constant
迭代之间的变化。x
是一个归约变量——它从一次迭代到下一次累积数据。它总是有一些初始化(在本例中为 x = 0
),虽然每次迭代中积累的数据可能不同,但操作符保持不变。换句话说,在每次迭代中
x_new = x_old op data
, 和 op
在所有迭代中保持不变(尽管 data
可能会改变)。多国语言 there's a special syntax for performing something like this - 通常称为“折叠”或“减少”或“累积”(还有其他名称)-但在 LLVM IR 的上下文中,归纳变量将由循环和它之前的初始化值。
归约变量中的交换*操作(例如加法)对于优化编译器特别有趣,因为它们似乎显示出比实际情况更强的迭代之间的依赖性;例如,上面的示例可以重写为向量化形式——比如一次添加 4 个数字,然后是一个小循环,将最终向量相加为单个值。
* 实际上,在应用这样的矢量化之前,reduce 变量必须满足更多条件,但这确实超出了此处的范围
关于variables - 什么是减少变量?谁能给我一些例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14955912/