2

我正在尝试使用 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 可以对未知的迭代次数进行剥离挖掘吗?

4

1 回答 1

0

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

此外,请确保 GCC 获得了--with-ppland--with-cloog选项(如文档中关于使用 Graphite in 中所述-floop-strip-mine)。没有这些,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
于 2013-07-21T07:53:56.857 回答