Precisión de punto flotante simple versus doble


13

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?

Respuestas:


7

Para todos los problemas no triviales (es decir, para aquellos en los que el rendimiento es importante), casi toda la memoria que tenga estará en la matriz y relativamente poco en los vectores. Por ejemplo, para los elementos 3D Taylor-Hood para la ecuación de Stokes, tiene unos cientos de elementos por fila en la matriz, y esto supera ampliamente la cantidad de memoria necesaria para los vectores. Así, hemos jugado con la idea de almacenar la matriz como flotantes y los vectores como dobles. No recuerdo nuestros resultados de tiempo, pero estoy seguro de que no hemos visto ningún problema con el redondeo, etc. Así que este enfoque definitivamente funciona.


Gracias, profesor Bangerth. ¿Qué pasa con los solucionadores de matriz iterativos? ¿Escala al doble de precisión para los productos de matriz-vector o escala los elementos del vector a simple para las multiplicaciones y retrocede al doble para la acumulación?
Costis

Por supuesto, estaba hablando de solucionadores iterativos. Hacemos todos los vectores en doble precisión (porque no importa), por lo que la operación dst = matrix src ocurre como double = float double. La acumulación ocurre entonces con doble precisión, pero en realidad me sorprendería mucho si importara.
Wolfgang Bangerth

Hay un documento en algún lugar (desde hace quizás 2 décadas) que indica que los productos de punto deben hacerse con una precisión superior al doble. No tengo la referencia a mano, pero veré si puedo encontrarla más tarde.
Bill Barth

Sí, eso no me sorprendería. Eso también coincide con lo que hacemos.
Wolfgang Bangerth

¿Utiliza precisión cuádruple para productos de punto? Si es así, genial! No había escuchado que alguien estuviera haciendo esto en una biblioteca.
Bill Barth


3

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,

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.