【发布时间】:2013-09-30 21:31:26
【问题描述】:
#include <stdio.h>
int main() {
int i;
for(i=0;i<10000;i++){
printf("%d",i);
}
}
我想使用 gcc 对此代码进行循环展开 但即使使用标志。
gcc -O2 -funroll-all-loops --save-temps unroll.c
我得到的汇编代码包含一个 10000 次迭代的循环
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
pushq %r14
pushq %rbx
Ltmp2:
xorl %ebx, %ebx
leaq L_.str(%rip), %r14
.align 4, 0x90
LBB1_1:
xorb %al, %al
movq %r14, %rdi
movl %ebx, %esi
callq _printf
incl %ebx
cmpl $10000, %ebx
jne LBB1_1
popq %rbx
popq %r14
popq %rbp
ret
Leh_func_end1:
请告诉我如何在 gcc 中正确实现循环展开
【问题讨论】:
-
尝试改用
-O3 -
优化器可能发现展开这个循环比让它保持原样慢。
-
与您的完全相同的标志。
-
请记住,如果循环展开太多,循环代码将无法放入 L1 缓存,并且缓存未命中比分支更昂贵。展开所有 10k 次迭代可能会比完全不展开要慢(相对而言)。中间某处有一个最佳展开量。
-
它不会“让代码变得超快”。如果主要开销是循环控制的东西,它会更快。在 printf() 的情况下,它肯定不是:I/O 是瓶颈。编译器没有义务展开每个循环。
标签: c optimization gcc loop-unrolling