【发布时间】:2012-11-12 01:06:24
【问题描述】:
在gcc 4.4.6 文档中声明:
-funroll-all-loops: Unroll all loops, even if their number of iterations is uncertain when the loop isentered.
我正在编译这段代码:
int unroll(){
int i = 0;
int array[1000];
do {
use(i,array);
i++;
}while(i<1000);
return(0);
}
void use(int i, int *array){
int x = i*5;
array[i] = x;
}
...一次使用funroll-all-loops 优化,一次没有:
OPT = -funroll-all-loops
NOOPT = -O0
然后我使用diff 比较每个的汇编代码(使用-S -fverbose-asm 生成)。
生成的代码是相同的。
尝试将循环更改为do while;
调整循环计数器(最多 100 个);
更改循环体内的语句。
我会错过什么?为什么这个循环没有展开?
更新
Nikos C 建议使用--param max-unroll-times=N 提高循环注册参数,其中 N 是上限。
虽然这是一个明智的建议,但它并没有改变行为。
我还将循环迭代次数降低到只有 10 次。
还更新了代码以实际“做”某事,没有变化。
【问题讨论】:
-
-O0告诉 gcc 不要应用任何优化,包括展开。试试-O或-O2。 -
我认为
NOOPT = -O0表示一种控制情况(即,预期没有展开循环的情况)。 -
是的,这是故意的。 NOOPT 是用于生成汇编代码以进行比较而无需展开循环的标志。
-
尝试强制编译器内联
use()。通常根本没有理由展开具有函数调用的循环。 -
又一个
If I disable optimization, why doesn't gcc optimize?问题。
标签: c optimization gcc gcc4 loop-unrolling