[hellogcc] 请问下以下gcc -O0 和 -O1的代码运行时间不同的原因

  • From: 秦� <love.infly@xxxxxxxxx>
  • To: hellogcc@xxxxxxxxxxxxx
  • Date: Mon, 29 Jul 2013 16:51:07 +0800

c代码本身很简单
for (i = 0; i< SIZE; i+=j){
            arr[i] *=3;
}

就是以一个步进值j遍历整个数组,对成员做*3操作。

O0的代码,步进的值在-24(%rbp)中:

    movq    $0, -32(%rbp)
    jmp    .L5
.L6:
    movq    -32(%rbp), %rax
    movl    arr(,%rax,4), %edx
    movl    %edx, %eax
    addl    %eax, %eax
    addl    %eax, %edx
    movq    -32(%rbp), %rax
    movl    %edx, arr(,%rax,4)
    movq    -24(%rbp), %rax
    addq    %rax, -32(%rbp)
.L5:
    cmpq    $67108863, -32(%rbp)

O1的代码,步进的值在 %rbx中:

    movl    $0, %eax
.L3:
    movl    arr(,%rax,4), %ecx
    leal    (%rcx,%rcx,2), %edx
    movl    %edx, arr(,%rax,4)
    addq    %rbx, %rax
    cmpq    $67108863, %rax
    jle    .L3


想问的问题是,在O0情况下,j = 1的时间是j=2时间的两倍,O1下,两者就基本接近了,甚至步进为1的还快点,为什么?

问题来源是:http://stackoverflow.com/questions/17914782/why-cache-doesnt-work-as-it-supposed-to-be/17915086#17915086

我自己改改O0的代码,变成如下:

    movq    $0, -32(%rbp)
    movl    $0, %eax
    movq    -24(%rbp), %rbx
    jmp .L5
.L6:
    movl    arr(,%rax,4), %edx
    movl    %edx, %ecx
    addl    %ecx, %ecx
    addl    %ecx, %edx
    movl    %edx, arr(,%rax,4)
    addq    %rbx, %rax
.L5:
    cmpq    $67108863, %rax
    jle .L6

就和O1差不多了。

但是不明白,循环里改掉了几个movq,怎么j = 1的速度就和j = 2的差不多了?原因是什么?

谢谢了。

Other related posts:

  • » [hellogcc] 请问下以下gcc -O0 和 -O1的代码运行时间不同的原因 - 秦�