Nee*_*ury 7 c optimization gcc loop-unrolling
#include <stdio.h>
int main() {
int i;
for(i=0;i<10000;i++){
printf("%d",i);
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用gcc循环展开此代码,但即使使用该标志.
gcc -O2 -funroll-all-loops --save-temps unroll.c
Run Code Online (Sandbox Code Playgroud)
我得到的汇编代码包含一个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:
Run Code Online (Sandbox Code Playgroud)
可以somone plz告诉我如何在gcc中正确实现循环展开
循环展开不会为此代码带来任何好处,因为函数调用printf()自身的开销主导了每次迭代完成的工作.编译器可能已经意识到这一点,并且由于要求它优化代码,因此它可能会决定展开会增加代码大小,从而没有明显的运行时性能增益,并且决定引发指令高速缓存未命中的风险太高执行展开.
加速此循环所需的展开类型需要减少对其printf()自身的调用次数.我不知道任何能够做到这一点的优化编译器.
作为展开循环以减少printf()调用次数的示例,请考虑以下代码:
void print_loop_unrolled (int n) {
int i = -8;
if (n % 8) {
printf("%.*s", n % 8, "01234567");
i += n % 8;
}
while ((i += 8) < n) {
printf("%d%d%d%d%d%d%d%d",i,i+1,i+2,i+3,i+4,i+5,i+6,i+7);
}
}
Run Code Online (Sandbox Code Playgroud)
gcc has maximum loops unroll parameters.
You have to use -O3 -funroll-loops and play with parameters max-unroll-times, max-unrolled-insns and max-average-unrolled-insns.
Example:
-O3 -funroll-loops --param max-unroll-times=200
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3967 次 |
| 最近记录: |