Почему оптимизация O3 не улучшает производительность при использовании типа с плавающей запятой?
Я составил соответствующий C
реализация двух float
а также int
программа умножения матриц, когда я компилирую их в O2
почти все то же самое, но когда я использую O3
признак использования возможности автоматической векторизации, оба они приводят к разным ускорениям. Я вижу, что сборка положена и обнаружил различия, но я не знаю, почему GCC
составлен так? в чем причина и различия между float
тип и int
тип?
Перед умножением я перенес вторую матрицу по ряду причин. размер матриц 128х128 и ускорение O2
скалярная реализация int составляет 5,4 по сравнению с той же реализацией, когда я включаю O3
флаг и для float
Ускорение реализации чуть-чуть хуже 0.94
,
Инт сборка вышла:
.L2:
vmovdqa 448(%rdi), %ymm0
movl $c_tra, %eax
movq %r8, %rdx
vmovdqa (%rdi), %ymm15
vmovdqa %ymm0, -48(%rsp)
vmovdqa 480(%rdi), %ymm0
vmovdqa 32(%rdi), %ymm14
vmovdqa 64(%rdi), %ymm13
vmovdqa 96(%rdi), %ymm12
vmovdqa 128(%rdi), %ymm11
vmovdqa 160(%rdi), %ymm10
vmovdqa 192(%rdi), %ymm9
vmovdqa 224(%rdi), %ymm8
vmovdqa 256(%rdi), %ymm7
vmovdqa 288(%rdi), %ymm6
vmovdqa 320(%rdi), %ymm5
vmovdqa 352(%rdi), %ymm4
vmovdqa 384(%rdi), %ymm3
vmovdqa 416(%rdi), %ymm2
vmovdqa %ymm0, -80(%rsp)
.p2align 4,,10
.p2align 3
.L5:
vpmulld 32(%rax), %ymm14, %ymm0
vpmulld (%rax), %ymm15, %ymm1
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 64(%rax), %ymm13, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 96(%rax), %ymm12, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 128(%rax), %ymm11, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 160(%rax), %ymm10, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 192(%rax), %ymm9, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 224(%rax), %ymm8, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 256(%rax), %ymm7, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 288(%rax), %ymm6, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 320(%rax), %ymm5, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 352(%rax), %ymm4, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 384(%rax), %ymm3, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vpmulld 416(%rax), %ymm2, %ymm0
vpaddd %ymm0, %ymm1, %ymm1
vmovdqa -48(%rsp), %ymm0
addq $512, %rax
addq $4, %rdx
vpmulld -64(%rax), %ymm0, %ymm0
vpaddd %ymm0, %ymm1, %ymm0
vmovdqa -80(%rsp), %ymm1
vpmulld -32(%rax), %ymm1, %ymm1
vpaddd %ymm0, %ymm1, %ymm1
vmovdqa %xmm1, %xmm0
vextracti128 $0x1, %ymm1, %xmm1
vpextrd $1, %xmm0, %esi
vpextrd $0, %xmm0, %ecx
addl %esi, %ecx
vpextrd $2, %xmm0, %esi
addl %esi, %ecx
vpextrd $3, %xmm0, %esi
addl %esi, %ecx
vpextrd $0, %xmm1, %esi
addl %esi, %ecx
vpextrd $1, %xmm1, %esi
addl %esi, %ecx
vpextrd $2, %xmm1, %esi
addl %esi, %ecx
vpextrd $3, %xmm1, %esi
addl %esi, %ecx
movl %ecx, -4(%rdx)
cmpq $c_tra+65536, %rax
jne .L5
addq $512, %r8
addq $512, %rdi
cmpq $c_result+65536, %r8
jne .L2
Поплавок в сборе поставил:
.L2:
xorl %esi, %esi
.p2align 4,,10
.p2align 3
.L7:
movq %rdi, %rsi
xorl %eax, %eax
xorl %edx, %edx
salq $5, %rsi
.p2align 4,,10
.p2align 3
.L5:
vcvtsi2ss %edx, %xmm0, %xmm0
vmovss a(%rcx,%rax), %xmm2
vfmadd231ss c_tra(%rsi,%rax), %xmm2, %xmm0
addq $4, %rax
vcvttss2si %xmm0, %edx
cmpq $128, %rax
jne .L5
vcvtsi2ss %edx, %xmm0, %xmm0
vmovss %xmm0, c_result(%rcx,%rdi)
addq $4, %rdi
cmpq $128, %rdi
jne .L7