Performance regression 4.3 vs 4.4/4.5
Salvatore Filippone
salvatore.filippone@uniroma2.it
Thu Nov 19 14:18:00 GMT 2009
Hello,
A colleague of mine reported a sharp decrease in performance when moving
an application from 4.3.1 to 4.4.1/4.5.0. I have performed some
testing/profiling and can confirm that the drop comes about from the
attached subroutine, which is extracted and slightly obfuscated. I am
attaching the assembler code generated by 4.3.1 and 4.4.1 on an x86_64;
with the 4.3 version the test case runs in abnout 31 s, with the 4.4 in
about 45. The 4.4 version with just this subroutine compiled by 4.3 and
linked in runs again in about 31 s.
The compile options are in both cases
gfortran -O3 -Wuninitialized -fPIC -c
With larger test cases the difference in time can be as much as 100%
Anybody got ideas? I cannot post the entire code, unfortunately.
Salvatore
-------------- next part --------------
A non-text attachment was scrubbed...
Name: eval.f90
Type: text/x-fortran
Size: 647 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20091119/4240e3f2/attachment.bin>
-------------- next part --------------
.file "eval.f90"
.text
.p2align 4,,15
.globl eval_
.type eval_, @function
eval_:
.LFB2:
pushq %r15
.LCFI0:
movq %rdx, %r11
pushq %r14
.LCFI1:
pushq %r13
.LCFI2:
movq %r9, %r13
pushq %r12
.LCFI3:
pushq %rbp
.LCFI4:
pushq %rbx
.LCFI5:
movq 56(%rsp), %rax
movq %rcx, %rbx
movsd (%rsi), %xmm5
movq %rdi, -16(%rsp)
movsd (%rcx), %xmm6
movl (%rax), %r12d
movapd %xmm5, %xmm0
movq %r8, -24(%rsp)
mulsd %xmm6, %xmm0
cmpl $1, %r12d
movsd %xmm0, (%rdx)
jle .L12
movq 72(%rsp), %rax
xorpd %xmm4, %xmm4
movl $2, %r8d
movl $0, -8(%rsp)
xorl %ecx, %ecx
movl $8, %ebp
movl (%rax), %eax
movl %eax, -4(%rsp)
leal 2(%r12), %eax
cltq
subq $1, %rax
movq %rax, -48(%rsp)
movslq %r12d,%rax
leaq 0(,%rax,8), %r9
.p2align 4,,10
.p2align 3
.L11:
movl -8(%rsp), %edx
movsd 8(%rbx,%rcx,8), %xmm2
movapd %xmm5, %xmm0
leal -1(%rdx,%r8), %eax
mulsd %xmm2, %xmm0
cmpl -4(%rsp), %eax
movsd %xmm0, 8(%r11,%rcx,8)
jg .L3
movl %edx, %esi
movq -24(%rsp), %rdi
addl $1, %esi
movapd %xmm6, %xmm1
movslq %esi,%rax
leaq -8(%rdi,%rax,8), %rdx
xorl %eax, %eax
jmp .L5
.p2align 4,,10
.p2align 3
.L16:
movsd (%rbx,%rax), %xmm1
.L5:
movsd (%rdx), %xmm0
addq $8, %rdx
mulsd %xmm0, %xmm1
mulsd %xmm2, %xmm0
addsd 8(%r11,%rcx,8), %xmm1
movsd %xmm1, 8(%r11,%rcx,8)
addsd (%r11,%rax), %xmm0
movsd %xmm0, (%r11,%rax)
addq $8, %rax
cmpq %rbp, %rax
jne .L16
addl %ecx, %esi
addq $8, %rbp
addq $1, %rcx
cmpl %r12d, %r8d
movl %esi, -8(%rsp)
je .L12
.L17:
addl $1, %r8d
jmp .L11
.p2align 4,,10
.p2align 3
.L3:
movq 64(%rsp), %rax
xorl %edx, %edx
xorl %r10d, %r10d
movl $1, %edi
movl (%rax), %r14d
movl %r14d, %eax
subl %r8d, %eax
divl %r12d
movq -16(%rsp), %rdx
movsd (%rdx), %xmm3
leal (%r12,%r8), %edx
movl %eax, %r15d
movq -48(%rsp), %rax
addq %rcx, %rax
leaq (%r13,%rax,8), %rax
movq %rax, -32(%rsp)
movl %ecx, %eax
notl %eax
addl %edx, %eax
cltq
movq %rax, -40(%rsp)
.p2align 4,,10
.p2align 3
.L10:
cmpl %r14d, %r8d
movapd %xmm4, %xmm1
jg .L8
movsd 8(%r13,%rcx,8), %xmm1
testl %r15d, %r15d
subsd (%r13,%r10,8), %xmm1
mulsd %xmm1, %xmm1
addsd %xmm4, %xmm1
je .L8
movq -40(%rsp), %rdx
movq -32(%rsp), %rsi
leaq -1(%r10,%rdx), %rax
leaq (%r13,%rax,8), %rdx
movl %r15d, %eax
.p2align 4,,10
.p2align 3
.L9:
movsd (%rsi), %xmm0
addq %r9, %rsi
subsd (%rdx), %xmm0
addq %r9, %rdx
subl $1, %eax
mulsd %xmm0, %xmm0
addsd %xmm0, %xmm1
jne .L9
.L8:
addsd %xmm3, %xmm1
addl $1, %edi
sqrtsd %xmm1, %xmm1
movapd %xmm1, %xmm0
mulsd %xmm2, %xmm1
mulsd (%rbx,%r10,8), %xmm0
addsd 8(%r11,%rcx,8), %xmm0
movsd %xmm0, 8(%r11,%rcx,8)
addsd (%r11,%r10,8), %xmm1
movsd %xmm1, (%r11,%r10,8)
addq $1, %r10
cmpl %edi, %r8d
jne .L10
addq $1, %rcx
addq $8, %rbp
cmpl %r12d, %r8d
jne .L17
.L12:
popq %rbx
popq %rbp
popq %r12
popq %r13
popq %r14
popq %r15
ret
.LFE2:
.size eval_, .-eval_
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x1b
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2-.
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xe
.uleb128 0x18
.byte 0x4
.long .LCFI2-.LCFI1
.byte 0xe
.uleb128 0x20
.byte 0x8d
.uleb128 0x4
.byte 0x8e
.uleb128 0x3
.byte 0x8f
.uleb128 0x2
.byte 0x4
.long .LCFI3-.LCFI2
.byte 0xe
.uleb128 0x28
.byte 0x4
.long .LCFI4-.LCFI3
.byte 0xe
.uleb128 0x30
.byte 0x4
.long .LCFI5-.LCFI4
.byte 0xe
.uleb128 0x38
.byte 0x83
.uleb128 0x7
.byte 0x86
.uleb128 0x6
.byte 0x8c
.uleb128 0x5
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.3.1"
.section .note.GNU-stack,"",@progbits
-------------- next part --------------
.file "eval.f90"
.text
.p2align 4,,15
.globl eval_
.type eval_, @function
eval_:
.LFB0:
.cfi_startproc
pushq %r15
.cfi_def_cfa_offset 16
movsd (%rcx), %xmm7
pushq %r14
.cfi_def_cfa_offset 24
pushq %r13
.cfi_def_cfa_offset 32
pushq %r12
.cfi_def_cfa_offset 40
pushq %rbp
.cfi_def_cfa_offset 48
pushq %rbx
.cfi_def_cfa_offset 56
movq 56(%rsp), %rax
movsd (%rsi), %xmm6
movq %rdi, -32(%rsp)
movl (%rax), %eax
movq %rdx, %rdi
movq %r8, -24(%rsp)
movapd %xmm6, %xmm0
mulsd %xmm7, %xmm0
cmpl $1, %eax
movl %eax, -64(%rsp)
movsd %xmm0, (%rdx)
jle .L12
.cfi_offset 3, -56
.cfi_offset 6, -48
.cfi_offset 12, -40
.cfi_offset 13, -32
.cfi_offset 14, -24
.cfi_offset 15, -16
movq 72(%rsp), %rax
xorpd %xmm5, %xmm5
xorl %r12d, %r12d
movl $8, %r11d
xorl %r10d, %r10d
xorl %r14d, %r14d
movl (%rax), %eax
movl %eax, -36(%rsp)
movl -64(%rsp), %eax
subl $2, %eax
leaq 8(,%rax,8), %rax
movq %rax, -48(%rsp)
movslq -64(%rsp), %rax
leaq 2(%rax), %rdx
leaq 0(,%rax,8), %rsi
addq $1, %rax
movq %rax, -8(%rsp)
movq %rdx, -16(%rsp)
.p2align 4,,10
.p2align 3
.L11:
movl $2, %r8d
movsd 8(%rcx,%r10), %xmm3
movapd %xmm6, %xmm2
subl %r12d, %r8d
leal -1(%r14,%r8), %eax
cmpl -36(%rsp), %eax
movl %r12d, %edx
mulsd %xmm3, %xmm2
movsd %xmm2, 8(%rdi,%r10)
jg .L3
movq -24(%rsp), %rbp
movslq %r14d, %rax
movapd %xmm7, %xmm1
leaq 0(%rbp,%rax,8), %rbx
xorl %eax, %eax
jmp .L5
.p2align 4,,10
.p2align 3
.L17:
movsd 8(%rdi,%r10), %xmm2
movsd (%rcx,%rax), %xmm1
.L5:
movsd (%rbx), %xmm0
addq $8, %rbx
mulsd %xmm0, %xmm1
mulsd %xmm3, %xmm0
addsd %xmm2, %xmm1
movsd %xmm1, 8(%rdi,%r10)
addsd (%rdi,%rax), %xmm0
movsd %xmm0, (%rdi,%rax)
addq $8, %rax
cmpq %r11, %rax
jne .L17
negl %edx
leal 1(%r14,%rdx), %r14d
.L6:
addq $8, %r10
addq $8, %r11
subq $1, %r12
cmpq -48(%rsp), %r10
jne .L11
.L12:
popq %rbx
popq %rbp
popq %r12
popq %r13
popq %r14
popq %r15
ret
.p2align 4,,10
.p2align 3
.L3:
movq 64(%rsp), %rax
movq -32(%rsp), %rdx
xorl %ebx, %ebx
movapd %xmm7, %xmm4
movl (%rax), %r13d
movq -16(%rsp), %rax
movsd (%rdx), %xmm8
leaq -2(%rax), %rbp
movq -8(%rsp), %rax
movl %r13d, %edx
subl %r8d, %edx
movl %edx, -60(%rsp)
subq %r12, %rax
leaq (%r9,%rax,8), %rax
movq %rax, -56(%rsp)
.p2align 4,,10
.p2align 3
.L10:
cmpl %r13d, %r8d
movapd %xmm5, %xmm1
jg .L8
movsd 8(%r9,%r10), %xmm1
xorl %edx, %edx
movl -60(%rsp), %eax
subsd (%r9,%rbx), %xmm1
divl -64(%rsp)
mulsd %xmm1, %xmm1
testl %eax, %eax
addsd %xmm5, %xmm1
je .L8
movq -56(%rsp), %r15
leaq (%r9,%rbp,8), %rdx
.p2align 4,,10
.p2align 3
.L9:
movsd (%r15), %xmm0
addq %rsi, %r15
subsd (%rdx), %xmm0
addq %rsi, %rdx
subl $1, %eax
mulsd %xmm0, %xmm0
addsd %xmm0, %xmm1
jne .L9
.L8:
addsd %xmm8, %xmm1
addq $1, %rbp
sqrtsd %xmm1, %xmm1
movapd %xmm1, %xmm0
mulsd %xmm3, %xmm1
mulsd %xmm4, %xmm0
addsd %xmm2, %xmm0
movsd %xmm0, 8(%rdi,%r10)
addsd (%rdi,%rbx), %xmm1
movsd %xmm1, (%rdi,%rbx)
addq $8, %rbx
cmpq %r11, %rbx
je .L6
movsd 8(%rdi,%r10), %xmm2
movsd (%rcx,%rbx), %xmm4
jmp .L10
.cfi_endproc
.LFE0:
.size eval_, .-eval_
.ident "GCC: (GNU) 4.4.1 20090725 (Red Hat 4.4.1-2)"
.section .note.GNU-stack,"",@progbits
More information about the Fortran
mailing list