Arquitetura de CPU e matemática de ponto flutuante

5

Estou tentando passar alguns detalhes sobre como a matemática de ponto flutuante é executada na CPU, tentando entender melhor quais tipos de dados usar, etc.

Acho que tenho um bom entendimento de como a matemática inteira é executada. Se eu entendi corretamente, e desconsiderando SIMD, uma CPU de 32 bits geralmente executará matemática inteira com precisão de pelo menos 32 bits, etc.

É correto que a matemática de ponto flutuante dependa da presença de um FPU? E que a FPU no x86 é de 80 bits, então a matemática de ponto flutuante é executada com essa precisão, a menos que seja usado o SIMD? E o ARM?

    
por Jo-Herman Haugholt 21.11.2011 / 14:07
fonte

3 respostas

5

Muitas vezes, operações como ponto flutuante e gerenciamento de memória são codificadas de uma forma que podem ser "capturadas". Isso significa que o sistema pode ser configurado para usar hardware ou desviar automaticamente para uma implementação de software. No caso de software, a implementação pode ser qualquer coisa, embora a maioria dos fabricantes forneça bibliotecas que seguem os padrões aceitos (IEEE-754 no caso de ponto flutuante). Em muitos sistemas, quando uma unidade de ponto flutuante ou outro chip é instalado, a execução da instrução é automaticamente adiada para o novo chip, portanto, nenhuma reconfiguração de software é necessária.

Pelo que entendi, a arquitetura ARM faz algo muito semelhante ao x86, com instruções de ponto flutuante

    
por 21.11.2011 / 14:41
fonte
1

Se você entender os tipos de dados C, ele poderá oferecer suporte aos seguintes formatos:

O número de bits é distribuído como: {Sign + Exponent + Significand}

float -que é de 32 bits distribuídos como 1 + 8 + 23.
dbouble -que é 64 bits distribuídos como 1 + 11 + 52.
Extended double - que é 80 bits dist. como 1 + 15 + 64.

Assim, o dobro estendido com precisão de 80 bits é o maior comprimento que pode ser suportado por C em x86. Lembre-se de que, se sua variável for float (32 bits), ela ainda terá precisão equivalente a 32 bits, não em 80 bits no armazenamento final. No entanto, na maioria das CPUs, as ALUs e FPUs são geralmente maiores que o tamanho da palavra nativa, de modo que os resultados intermediários não excedem.

Para suportar qualquer precisão melhor que a anterior, é necessário suporte adicional ao software. É possível criar uma aritmética de maior precisão (por exemplo, rotinas criptográficas que geram aritmética, que variam de 128 a 1024 bits; mas esse suporte adicional é gerado a partir de software).

    
por 21.11.2011 / 15:06
fonte
-1

Você não precisa de hardware de ponto flutuante para usar matemática de ponto flutuante.

O IEEE-754 tem um número de comprimentos de ponto flutuante 80, 64, 32 e agora um 16. Existem outros formatos de ponto flutuante não-ieee. O formato / padrão do IEEE é muito doloroso, quase todos os recursos são desperdiçados, poucos os conhecem e poucos ou nenhum dos idiomas permitem usá-los. Com hardware compatível, você ainda pode deixar de atender à especificação, porque o software / sistema operacional é parte dela. Você é obrigado a fornecer respostas diferentes, dependendo se as exceções estão presas, por exemplo. Você poderia encontrar formatos de ponto flutuante não-IEEE em DSPs para velocidade, tamanho do processador, etc. Eles estavam mais sintonizados com o que você realmente usava o FPU e não tudo o que poderíamos querer e a abordagem da pia da cozinha que o padrão IEEE usa.

Nem todo hardware fpu suporta todos os tamanhos.

Os erros do fpu são frequentemente resolvidos por não usar o hardware para a instrução quebrada, ou a instrução quebrada é envolvida pelo software para corrigir quaisquer problemas. O hardware pode ter ficado melhor nos últimos 5-10 anos, mas foi difícil encontrar um hardware sem erros. Para evitar o embaraço do pentium novamente, você precisaria ou pelo menos quer consertar os bugs no software. A dificuldade da especificação IEEE é porque é raro encontrar um sistema que atenda completamente a especificação. Corrigindo o bug no software entra em compiladores e sistemas operacionais, a menos que você controle todos os três (hardware, compilador, sistema operacional), você provavelmente falhará também.

Normalmente, você compila seu programa sabendo o que você espera executar, pelo menos com o ARM que você compila para float duro ou flutuação suave. É certamente possível detectar a biblioteca de ponto flutuante e, em seguida, usar a solução apropriada de lá em diante para que um binário funcione em ambos. Você tem que examinar cada compilador separadamente para saber quais são as soluções / regras. Os compiladores tendem a saber quais plataformas normalmente não suportam e constroem para soft float por padrão e outras plataformas que normalmente ou sempre possuem um fpu e normalmente constroem para um fpu de hardware, por exemplo.

Tentando decidir quando usá-lo? Como regra geral, evite a menos que você realmente precise. Quando você o utiliza, há muitas maneiras de usá-lo errado, entender como usá-lo sem desperdiçá-lo ou sem obter a resposta errada. Você pode ter ficado melhor com matemática inteira ou mantendo a casa decimal.

    
por 14.01.2012 / 06:53
fonte