Precisão de ponto flutuante simples versus duplo

13

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?

Costis
fonte

Respostas:

7

Para todos os problemas não triviais (ou seja, para aqueles em que o desempenho é importante), quase toda a memória que você possui estará na matriz e relativamente pouco em vetores. Por exemplo, para os elementos 3d de Taylor-Hood para a equação de Stokes, você tem algumas centenas de elementos por linha na matriz, e isso supera amplamente a quantidade de memória necessária para vetores. Assim, brincamos com a idéia de armazenar a matriz como flutuadores e os vetores como duplicados. Não recordo nossos resultados de tempo, mas tenho certeza de que não tivemos nenhum problema com o arredondamento, etc. Portanto, essa abordagem definitivamente funciona.

Wolfgang Bangerth
fonte
Obrigado, professor Bangerth. E os solucionadores de matriz iterativos? Você escala até a precisão dupla para os produtos vetoriais matriciais ou reduz os elementos vetoriais para simples para as multiplicações e volta para o dobro para acumulação?
Costis
Claro que eu estava falando sobre solucionadores iterativos. Como fazemos todos os vetores com precisão dupla (porque isso não importa), a operação dst = matrix src acontece como double = float double. A acumulação acontece em dupla precisão, mas eu ficaria realmente surpreso se isso importasse.
Wolfgang Bangerth
Há um documento por aí em algum lugar (de talvez duas décadas atrás) indicando que os produtos com pontos devem ser feitos com maior precisão do que duas vezes. Não tenho a referência à mão, mas vou ver se consigo encontrá-la mais tarde.
Bill Barth
Sim, isso não me surpreenderia. Isso também corresponde ao que fazemos.
Wolfgang Bangerth
Você usa precisão quad para produtos pontuais? Se sim, legal! Eu não tinha ouvido falar que alguém estava fazendo isso em uma biblioteca.
Bill Barth
3

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,

Thomas Klimpel
fonte