auto-vectorization on floats
http://sourceforge.jp/magazine/10/11/26/0710258 を見て.
gcc の場合は -ffast-math を渡してやる必要があったような,と思って調べてみた.
http://gcc.gnu.org/projects/tree-ssa/vectorization.html
ここによると -fassociative-math を渡してやる必要があるっぽい.
-fassociative-math を有効にするには,同時に -fno-signed-zeros と -fno-trapping-math が有効になっている必要がある.
これらのフラグは -funsafe-math-optimizations に含まれており,さらにこれは -ffast-math に含まれている.
以下 gcc-4.5.1 でフラグを変えつつ試してみた結果.
gcc -O3
xorps %xmm1, %xmm1 leaq 512(%rsp), %rcx xorl %eax, %eax movq %rsp, %rdx .p2align 4,,10 .p2align 3 .L2: movss (%rcx,%rax), %xmm0 mulss (%rdx,%rax), %xmm0 addq $4, %rax cmpq $512, %rax addss %xmm0, %xmm1 jne .L2 unpcklps %xmm1, %xmm1 movl $.LC1, %edi movl $1, %eax cvtps2pd %xmm1, %xmm0 call printf
gcc -O3 -ffast-math
xorps %xmm1, %xmm1 leaq 512(%rsp), %rdx xorl %eax, %eax movq %rsp, %rcx .p2align 4,,10 .p2align 3 .L2: movaps (%rcx,%rax), %xmm0 mulps (%rdx,%rax), %xmm0 addq $16, %rax cmpq $512, %rax addps %xmm0, %xmm1 jne .L2 movaps %xmm1, %xmm0 movl $.LC0, %edi movl $1, %eax movhlps %xmm1, %xmm0 addps %xmm1, %xmm0 movaps %xmm0, %xmm1 shufps $85, %xmm0, %xmm1 addps %xmm0, %xmm1 movaps %xmm1, %xmm0 unpcklps %xmm0, %xmm0 cvtps2pd %xmm0, %xmm0 call printf
更にループアンローリングを有効にすると記事のリスト2に近いコードになった.
gcc -O3 -ffast-math -funroll-loops
xorps %xmm0, %xmm0 leaq 512(%rsp), %rdx xorl %eax, %eax movq %rsp, %rcx .p2align 4,,10 .p2align 3 .L2: movaps (%rcx,%rax), %xmm8 mulps (%rdx,%rax), %xmm8 movaps 16(%rcx,%rax), %xmm7 mulps 16(%rdx,%rax), %xmm7 movaps 32(%rcx,%rax), %xmm6 mulps 32(%rdx,%rax), %xmm6 addps %xmm8, %xmm0 movaps 48(%rcx,%rax), %xmm5 mulps 48(%rdx,%rax), %xmm5 movaps 64(%rcx,%rax), %xmm4 addps %xmm7, %xmm0 mulps 64(%rdx,%rax), %xmm4 movaps 80(%rcx,%rax), %xmm3 mulps 80(%rdx,%rax), %xmm3 addps %xmm6, %xmm0 movaps 96(%rcx,%rax), %xmm2 mulps 96(%rdx,%rax), %xmm2 movaps 112(%rcx,%rax), %xmm1 addps %xmm5, %xmm0 mulps 112(%rdx,%rax), %xmm1 subq $-128, %rax cmpq $512, %rax addps %xmm4, %xmm0 addps %xmm3, %xmm0 addps %xmm2, %xmm0 addps %xmm1, %xmm0 jne .L2 movaps %xmm0, %xmm9 movl $.LC0, %edi movl $1, %eax movhlps %xmm0, %xmm9 addps %xmm0, %xmm9 movaps %xmm9, %xmm0 shufps $85, %xmm9, %xmm0 addps %xmm9, %xmm0 unpcklps %xmm0, %xmm0 cvtps2pd %xmm0, %xmm0 call printf