GCC中的循环展开
我试图了解GCC中展开是如何完成的。我已经编写了一个C代码来添加数组元素来实现这一点GCC中的循环展开,c,gcc,assembly,loop-unrolling,C,Gcc,Assembly,Loop Unrolling,我试图了解GCC中展开是如何完成的。我已经编写了一个C代码来添加数组元素来实现这一点 for(i=0;我至少需要声明a、b、c和i的整个块。可能编译器看不到,它们可能不是别名(参见restrict),什么可能会阻止优化。顺便说一句,当您查看生成的assember代码内部时,使用gcc-S-fverbose asm-O2是很有帮助的。要获得额外的分数,请使用Intel语法输出asm。如果您将计数减少到较小的值,例如16,编译器会展开循环吗?32?64?我会怀疑whi之后会有限制ch有一个截止点,但
for(i=0;我至少需要声明a
、b
、c
和i
的整个块。可能编译器看不到,它们可能不是别名(参见restrict
),什么可能会阻止优化。顺便说一句,当您查看生成的assember代码内部时,使用gcc-S-fverbose asm-O2
是很有帮助的。要获得额外的分数,请使用Intel语法输出asm。如果您将计数减少到较小的值,例如16,编译器会展开循环吗?32?64?我会怀疑whi之后会有限制ch有一个截止点,但我没有访问gcc的权限来检查这个怀疑。@dasblinkenlight它不需要完全展开循环。(对于这样大小的循环,这确实是愚蠢的。)分组8(大约)在每次迭代中重复添加将有助于大大减少簿记开销,并对任何大小的循环都有意义。然而,我发现GCC并不急于这样做,使用Duff的设备进行手动展开有时仍然可以提高性能,即使启用了所有优化。
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $196504, %rsp
movl $0, -196612(%rbp)
jmp .L2
.L3:
movl -196612(%rbp), %eax
cltq
movl -196608(%rbp,%rax,4), %edx
movl -196612(%rbp), %eax
cltq
movl -131072(%rbp,%rax,4), %eax
addl %eax, %edx
movl -196612(%rbp), %eax
cltq
movl %edx, -65536(%rbp,%rax,4)
addl $1, -196612(%rbp)
.L2:
cmpl $16383, -196612(%rbp)
jle .L3
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc