Los números de punto flotante de precisión simple ocupan la mitad de la memoria y en máquinas modernas (incluso en GPU parece) las operaciones se pueden hacer con ellos a casi el doble de velocidad en comparación con la precisión doble. Muchos códigos FDTD que he encontrado utilizan exclusivamente aritmética y almacenamiento de precisión única. ¿Existe una regla general de cuándo es aceptable usar precisión única para resolver sistemas de ecuaciones dispersos a gran escala? Supongo que debe depender en gran medida del número de condición de la matriz.
Además, ¿existe alguna técnica efectiva que use doble precisión cuando sea necesario y única cuando no se requiera la precisión del doble? Por ejemplo, creo que para una multiplicación vectorial de matriz o un producto de puntos vectoriales, podría ser una buena idea acumular los resultados en una variable de doble precisión (para evitar errores de cancelación), pero que las entradas individuales se multipliquen entre sí se puede multiplicar con precisión simple.
¿Las FPU modernas permiten sin problemas la conversión de precisión simple (flotante) a precisión doble (doble) y viceversa? ¿O son estas operaciones costosas?
fuente
Un buen artículo sobre este tema es Acelerar los cálculos científicos con algoritmos de precisión mixtos .
fuente
Mi consejo sería centrarse principalmente en el consumo de memoria para la decisión de cuándo usar precisión única (flotante). Por lo tanto, los datos masivos para un cálculo FDTD deberían usar flotante, pero mantendría la descripción del problema en sí (como la geometría, los parámetros del material, las condiciones de excitación) y todos los metadatos relacionados en doble.
Mantendría todo el rendimiento acrítico y los cálculos no analizados en profundidad en doble. Especialmente, mantendría los datos poligonales y otra descripción de la geometría en doble (quizás incluso entero si es posible), ya que la experiencia dice que nunca obtendrá las partes geométricas computacionales de su código completamente robustas, incluso si fuera posible en teoría.
Una tercera parte que mantendría en doble son los cálculos analíticos, incluidos los accesos directos que utilizan descomposiciones de valores propios no simétricos. Como ejemplo, tengo funciones 2D simétricas rotacionales definidas por partes, y necesito su transformada de Fourier. Habría varias formas numéricas de FFT y "filtros analíticos de paso bajo" apropiados para obtener "eficientemente". Debido a que su rendimiento no es crítico, utilicé una expresión analítica "exacta" que involucra las funciones de Bessel. Dado que, para empezar, este era un atajo, y no pasaré ningún tiempo analizando la propagación de errores de mi fórmula complicada, es mejor que use doble precisión para ese cálculo. (Todavía resultó que solo algunas de las expresiones analíticas equivalentes para la fórmula eran utilizables,
fuente