Почему оптимизация 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

0 ответов

Другие вопросы по тегам