Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC中的循环展开_C_Gcc_Assembly_Loop Unrolling - Fatal编程技术网

GCC中的循环展开

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有一个截止点,但

我试图了解GCC中展开是如何完成的。我已经编写了一个C代码来添加数组元素来实现这一点


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