【问题标题】:What is reduction variable? Could anyone give me some examples?什么是减少变量?谁能给我一些例子?
【发布时间】:2013-02-04 00:59:19
【问题描述】:

什么是归约变量? 谁能给我一些例子?

【问题讨论】:

    标签: variables llvm reduction


    【解决方案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+* 等,并且opconstant 在迭代之间都不会改变。

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

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

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

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

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

    【讨论】:

    • 谢谢你的帮助,奥克~
    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 2013-06-06
    • 2010-12-28
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多