Eu tenho um sistema de processamento de sinal digital que opera em uma máquina x86 rápida usando números de ponto flutuante de precisão dupla . Ocorreu-me que eu realmente não estou usando a enorme faixa dinâmica da representação de ponto flutuante - todas as quantidades cabem facilmente na faixa ± 32768.
Minha pergunta: é possível que a mudança para cálculos de ponto fixo forneça um benefício em precisão numérica (alta prioridade) ou tempo de computação (baixa prioridade)?
Obviamente, a resposta depende de quantos bits estão disponíveis para um cálculo de ponto fixo. Quantos bits de precisão os sistemas típicos de ponto fixo utilizam? É possível fazer cálculos de ponto fixo com eficiência, com, digamos, 64 bits ( parte inteira de 16 bits, parte fracionária de 48 bits ) em x86-64?
Eu sempre pensei que os cálculos de ponto fixo eram usados apenas em situações onde a energia da CPU é limitada - faz sentido usar cálculos de ponto fixo quando a energia da CPU não é uma preocupação?
fonte
Respostas:
A precisão numérica dos números inteiros só será melhor que a precisão numérica dos flutuadores se a resolução inteira for melhor. Os duplos têm 52 bits fracionários; portanto, flutuadores de precisão dupla têm uma resolução pior que números inteiros em torno de , que é muito maior que 32768 ( 2 15 ). Portanto, não, a precisão numérica não será melhor se você usar números inteiros.252 215
A segunda questão é a velocidade. A resposta é: depende do hardware. Se você estiver executando seu programa em um processador de sinal digital que possua múltiplos núcleos de multiplicação / acumulação de ponto fixo, então sim, será muito mais rápido no ponto fixo. Em um chip x86, por outro lado, provavelmente será mais lento no ponto fixo. Fiz exatamente o que você está falando uma vez e viu meus tempos de execução aumentarem.
Depois de fazer algumas pesquisas na internet, descobri que isso é comum. O motivo é que ele possui um processador de ponto flutuante dedicado que não faz nada quando você faz a transição para o ponto fixo, enquanto o hardware de ponto fixo é compartilhado com a ação regular de ponto fixo, como a aritmética de ponteiros.
Se você deseja acelerar o processamento, a maneira de fazer isso é mudar de flutuadores de precisão dupla para flutuadores de precisão única. Isso deve produzir um aumento significativo na velocidade. Obviamente, isso reduziria sua precisão numérica.
fonte
Os méritos do ponto fixo são principalmente em termos de energia (como quando você tem uma opção de hardware do processador ou o processador é bom em desligar unidades funcionais não utilizadas). Isso ocorre porque as unidades de ponto fixo são geralmente menores (menos transistores, fios mais curtos, menos capacitância a superar por MAC) para uma dada taxa de emissão de tecnologia e operação do que o ponto flutuante.
No entanto, uma grande quantidade de processadores contemporâneos comuns (servidor, PC e até móvel) possui FPUs cada vez mais rápidas (especialmente unidades FP de precisão única) do que multiplicadores inteiros, e a maior parte da energia do sistema não é o uso da FPU, portanto, o uso de fixos O point-point terá pouca ou nenhuma vantagem para a computação típica de DSP nesses produtos e provavelmente pode ser uma desvantagem em termos de desempenho puro. Usando a tecnologia atual, qualquer vantagem para o ponto fixo se acumulará principalmente em pequenos produtos incorporados, como dispositivos do tamanho de botões.
No entanto, considere também as pegadas de cache da memória e do processador. O uso inteligente de tipos de dados menores (short int e float) para ajustar completamente uma computação grande no cache de dados pode compensar qualquer vantagem pura da largura de banda da FPU.
fonte
Prefira flutuações de precisão única a duplicadas - isso reduzirá pela metade a largura de banda da memória, a área de cache e os requisitos de armazenamento, além de tornar mais rápidas as operações matemáticas. Também abre a possibilidade de SIMD de 4 vias, se for necessária uma otimização adicional.
O ponto fixo só vale realmente a pena quando você não possui uma FPU - as CPUs x86 mais modernas têm duas FPUs; portanto, não há nada a ganhar com o uso do ponto fixo, e o desempenho pode ser significativamente pior com o ponto fixo. (Observe também que o ponto fixo requer instruções adicionais em comparação com o ponto flutuante para operações como multiplicação.)
fonte
Além das respostas muito boas fornecidas aqui, vale a pena acrescentar algumas coisas:
fonte
Alguns pontos a considerar:
Como palavra final, acho que nossos dados do mundo real são preciosos e o processamento de números cegos do computador é um trabalho humilde e servil. O computador deve ser colocado para fazer o trabalho pesado para seus dados e para você, e não deve ser tratado como se fosse a verdadeira estrela do programa.
fonte