Os números de ponto flutuante de precisão única ocupam metade da memória e em máquinas modernas (mesmo nas GPUs, ao que parece), as operações podem ser feitas com eles quase duas vezes a velocidade em comparação com a precisão dupla. Muitos códigos FDTD que encontrei usam exclusivamente aritmética e armazenamento de precisão única. Existe uma regra prática quando é aceitável usar precisão única para resolver sistemas esparsos de equações em larga escala? Suponho que deve depender muito do número da condição da matriz.
Além disso, existe alguma técnica eficaz que utilize a precisão dupla, quando necessário, e única, onde a precisão da dupla não é necessária. Por exemplo, eu pensaria que, para uma multiplicação de vetores matriciais ou um produto de pontos vetoriais, pode ser uma boa idéia acumular os resultados em uma variável de precisão dupla (para evitar erros de cancelamento), mas que entradas individuais sejam multiplicadas entre si pode ser multiplicado usando precisão única.
Os FPU modernos permitem perfeitamente a conversão de precisão única (flutuante) para precisão dupla (dupla) e vice-versa? Ou são essas operações caras?
fonte
Um bom artigo sobre este tópico é Acelerando cálculos científicos com algoritmos de precisão mista .
fonte
Meu conselho seria focar principalmente no consumo de memória para a decisão de usar precisão única (flutuação). Portanto, os dados em massa para uma computação FDTD devem usar float, mas eu manteria a descrição do problema em si (como geometria, parâmetros de material, condições de excitação) e todos os metadados relacionados em dobro.
Eu manteria todo o desempenho acrítico e os cálculos não profundamente analisados em dobro. Especialmente, eu manteria dados poligonais e outras descrições da geometria em dobro (talvez até inteiro, se possível), já que a experiência diz que você nunca obterá as partes geométricas computacionais do seu código totalmente robustas, mesmo que isso fosse possível em teoria.
Uma terceira parte que eu manteria em dobro são os cálculos analíticos, incluindo atalhos usando decomposições de autovalores não simétricas. Como exemplo, eu tenho funções 2D simétricas rotacionais definidas por partes e preciso da sua transformação de Fourier. Haveria várias formas numéricas envolvendo FFTs e "filtros analíticos passa-baixo" para obtê-lo "de maneira eficiente". Como o desempenho não é crítico, usei uma expressão analítica "exata" envolvendo as funções de Bessel. Como esse foi um atalho para começar, e não vou gastar tempo analisando a propagação de erros da minha fórmula complicada, é melhor usar a precisão dupla para esse cálculo. (Ainda assim, apenas algumas das expressões analíticas equivalentes à fórmula eram utilizáveis,
fonte