Benefícios de x87 sobre SSE
Pergunta
Eu sei que o X87 tem maior precisão interna, o que é provavelmente a maior diferença que as pessoas veem entre as operações de TI e SSE. Mas tenho que me perguntar, há algum outro benefício em usar o x87? Eu tenho o hábito de digitar -mfpmath=sse
automaticamente em qualquer projeto e me pergunto se estou perdendo mais alguma coisa que o X87 FPU oferece.
Solução
Para o ASM escrito à mão, o X87 possui algumas instruções que não existem no conjunto de instruções SSE.
No topo da minha cabeça, é tudo trigonométrico como FSIN, FCOS, Fatan, Fatan2 e algumas coisas exponenciais/logaritmo.
Com gcc -O3 -ffast-math -mfpmath=387
, GCC9 vai Ainda é realmente embutido sin(x)
Como um fsin
Instrução, independentemente do que a implementação no LIBM teria usado. (https://godbolt.org/z/euc5gp).
Chamadas MSVC __libm_sse2_sin_precise
Ao compilar para x86 de 32 bits.
Se o seu código gasta a maior parte do tempo fazendo trigonometria, você poderá ver um pequeno ganho ou perda de desempenho se usar o X87, dependendo se a implementação padrão da biblioteca matemática usando SSE1/SSE2 é mais rápida ou mais lenta que o microcódigo lento para fsin
em qualquer CPU que você esteja usando.
Os fornecedores da CPU não se esforçam muito para otimizar o microcódigo para instruções x87 nas gerações mais recentes de CPUs, porque geralmente é considerada obsoleta e raramente usada. (Veja as contagens de UOP e a taxa de transferência para as instruções complexas x87 em Tabelas de instrução de Agner Fog Nas gerações recentes de CPUs: mais ciclos do que nas CPUs mais antigas). Quanto mais recente a CPU, mais provável que o X87 seja mais lento do que muitas funções SSE ou AVX para calcular as funções de log, exp, pow ou trig.
Mesmo quando o x87 está disponível, nem todas as bibliotecas de matemática optam por usar instruções complexas como fsin
Para implementar funções como sin()
, ou especialmente exp/log onde truques inteiros para manipular os padrões de bits FP baseados em log são úteis.
Alguns algoritmos DSP usam muito tatão, mas normalmente beneficiam um muito da vetorização automática com as bibliotecas de matemática SIMD.
No entanto, para o código de matemática, onde você gasta a maior parte do tempo fazendo adições, multiplicações etc. O SSE geralmente é mais rápido.
Também relacionado: Intel subestima os limites de erro em 1,3 quintilhão - o pior caso para fsin
(Cancelamento catastrófico para fsin
entradas muito próximas pi) é muito ruim. O software pode fazer melhor, mas apenas com técnicas lentas de precisão estendida.
Outras dicas
- Está presente em máquinas realmente antigas.
EOF
As instruções da FPU são menores que as instruções do SSE, por isso são ideais para coisas de demosceno
Existe considerável legado e compatibilidade de pequeno sistema com o X87: SSE é um recurso de processador relativamente novo. Se o seu código for executado em um microcontrolador incorporado, há uma boa chance de não suportar instruções SSE.
Mesmo os sistemas que não possuem uma FPU instalados geralmente fornecem emuladores 80x87 que tornarão o código funcionar de forma transparente (mais ou menos). Não conheço nenhum emulador SSE - certamente um dos meus sistemas não possui, então as versões mais recentes do Adobe Photoshop Elements se recusam a executar.
As instruções 80x87 têm boas características de operação paralelas que foram minuciosamente exploradas e analisadas desde sua introdução em 1982. Vários clones do X86 podem parar em uma SSE Instruções.
Conversão entre float
e double
é mais rápido com x87 (geralmente livre) do que com SSE. Com x87, você pode carregar e armazenar um float
, double
ou long double
para ou para a pilha de registro e é convertida para ou a partir de precisão estendida sem custo extra. Com a SSE, são necessárias instruções adicionais para fazer a conversão de tipo se os tipos forem misturados, porque os registros contêm float
ou double
valores. Essas instruções de conversão são bastante rápidas, mas demoram mais tempo.
A verdadeira correção é abster -se de misturar float
e double
excessivamente, não usar o x87, é claro.