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