gpt4 book ai didi

gcc 可以对未知的迭代次数进行循环优化( strip 挖掘/阻塞)吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:38 27 4
gpt4 key购买 nike

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

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(启用 graphite/cloog):

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

没有进行露天开采。

但如果我将迭代计数设置为常数(例如 100),它将按照宣传的方式进行 strip 开采。

我试着给它提示迭代次数很高 (assert( n > 1000), __builtin_expect(n, 1000)) 但这没有帮助。使用配置文件信息进行的简短实验也无济于事。

所以我的问题是,gcc 是否可以对未知的迭代次数进行剥离挖掘?

最佳答案

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

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

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


来自文档:

伪代码原始循环:

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

伪代码 strip-mined 循环:

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

关于gcc 可以对未知的迭代次数进行循环优化( strip 挖掘/阻塞)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17219691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com