【问题标题】:can gcc do loop optimizations (strip-mining/blocking) on unknown iteration count?gcc 可以对未知的迭代次数进行循环优化(条带挖掘/阻塞)吗?
【发布时间】:2013-07-21 15:53:56
【问题描述】:

我正在尝试使用 GCC >= 4.4 中可用的石墨循环优化框架,但如果迭代次数未知,我似乎无法让它应用任何转换。 例如。本示例代码:

int __attribute__((hot)) 
f(double * restrict a, double *restrict b, double *restrict c,  const int n)
{
    for (int i = 0; i < n; i++) {
       c[i] = a[i] + b[i*2];
    }
}

如果编译 gcc 4.7(启用石墨/cloog):

gcc -floop-strip-mine  -O2 -c -std=c99 file.c

没有进行露天开采。

但是,如果我将迭代次数设为常数(例如 100),它将按照宣传的方式进行条带挖掘。

我尝试提示它迭代计数很高(断言(n > 1000),__builtin_expect(n,1000)),但这没有帮助。 使用个人资料信息的简短实验也无济于事。

所以我的问题是,gcc 可以对未知的迭代次数进行条带挖掘吗?

【问题讨论】:

  • 我现在用 gcc-4.8 试了一下,它按预期工作,可能只是 gcc-4.7 没有按预期工作。

标签: c gcc


【解决方案1】:

一定要阅读GCC 4.5.0 Optimize Options 文档。 (搜索-floop-strip-mine,大约在页面下方的1/3处)

另外,确保 GCC 获得 --with-ppl--with-cloog 选项(如 -floop-strip-mine 中有关使用 Graphite 的文档中所述)。没有这些,GCC 可能甚至不会尝试对您的代码执行条带挖掘。

根据文档中的行为描述和伪代码示例,其中显示了一些具有有限条带长度和迭代次数的伪代码循环,我想说 GCC 可能不会对未知迭代次数进行条带挖掘。


来自文档:

伪代码原始循环:

DO I = 1, N
  A(I) = A(I) + C
ENDDO

伪代码剥离循环:

DO II = 1, N, 51
  DO I = II, min (II + 50, N)
    A(I) = A(I) + C
  ENDDO
ENDDO

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 2017-12-26
    • 2016-12-25
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多