Considere a NVIDIA Quadro RTX 8000 (especificações abaixo). Usá-lo para executar um único (precisão de 32 bits) fornece um desempenho teórico de 16,31 TFLOPS. Se reduzirmos a precisão para meia precisão (16 bits), o desempenho teórico dobra para 32,62 TFLOPS. No entanto, se reduzirmos pela metade a precisão de 32 bits para 64 bits, o desempenho teórico cai 32 vezes para 509,8 GFLOPS. Por que a perda de desempenho do FP32 para o FP64 é muito maior do que o ganho de desempenho da mudança do FP32 para o FP16?
Reconheço que isso nem sempre é o caso para cada GPU, mas minha impressão é que, para muitas GPUs, os ganhos de FP64 -> FP32 são muito maiores do que os ganhos de FP32 -> FP16.
Provavelmente porque o tamanho de registro padrão dentro das unidades é de 32 bits.
Um registrador de 32 bits pode conter dois valores de 16 bits que podem ser multiplicados, resultando em uma duplicação do desempenho.
Por outro lado, a multiplicação de valores de 64 bits exigiria 4 registros (dois valores de 64 bits divididos em partes de 32 bits cada) ou carregamento/armazenamento de memória entre os 32 bits mais baixos e os 32 bits mais altos dos 64 bits. valor de -bit. Haveria carga/armazenamentos e bytes adicionais necessários para lidar com estouro que pode usar mais registradores. Fazer matemática de ponto flutuante de 64 bits em registradores de 32 bits é viável, mas está longe de ser uma simples redução pela metade devido à largura dupla. Há muita matemática adicional envolvida porque você não pode fazer um simples "adicionar esses dois registradores", mas em vez disso tem que fazer a matemática do caminho mais longo.
From Stack Overflow Multiplicando um número de 64 bits por um número de 32 bits em 8086 asm
O ponto principal dos processadores vetoriais é que eles trabalham em fluxos de instruções e dados e até mesmo em uma GPU com largura de banda maciça o acesso à memória é caro, especialmente porque seus dados dependem de partes anteriores do cálculo. Por preferência, um processador vetorial quer apenas um fluxo de "executar este código simples contra esta enorme matriz" e muitas execuções repetidas em um dado rapidamente consomem largura de banda e núcleos de processador.
Há evidências de que o desempenho do FP64 em placas de "jogos" é prejudicado devido ao fato de ter muito poucas ou nenhuma unidade com capacidade para FP64. Como resultado, você acaba limitado a fazer matemática de 64 bits "da maneira mais difícil" em registradores de 32 bits.