什么是减少变量?谁能给我一些例子?
Posted
技术标签:
【中文标题】什么是减少变量?谁能给我一些例子?【英文标题】:What is reduction variable? Could anyone give me some examples? 【发布时间】:2013-02-04 00:59:19 【问题描述】:什么是归约变量? 谁能给我一些例子?
【问题讨论】:
【参考方案1】:这是一个用类 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 的上下文中,归纳变量将由 phi 节点表示在循环内部的二元运算和它之前的初始化值之间的循环中。
归约变量(例如加法)中的交换*操作对于优化编译器来说特别有趣,因为它们似乎在迭代之间显示出比实际情况更强的依赖性;例如,可以将上面的示例重写为矢量化形式 - 例如,一次添加 4 个数字,然后执行一个小循环以将最终矢量求和为单个值。
* 实际上,在应用这样的矢量化之前,归约变量必须满足更多条件,但这确实超出了这里的范围
【讨论】:
谢谢你的帮助,奥克~以上是关于什么是减少变量?谁能给我一些例子?的主要内容,如果未能解决你的问题,请参考以下文章
谁能给我一个在 WIX 中修改 windows 环境系统变量的例子吗?