Tengo un sistema de procesamiento de señal digital que funciona en una máquina rápida x86 con números de coma flotante de doble precisión . Se me ocurrió que realmente no estoy usando el enorme rango dinámico de la representación de coma flotante: todas las cantidades se ajustan fácilmente en el rango ± 32768.
Mi pregunta: ¿es posible que el cambio a cálculos de punto fijo proporcione un beneficio en la precisión numérica (alta prioridad) o el tiempo de cálculo (baja prioridad)?
Por supuesto, la respuesta depende de cuántos bits están disponibles para un cálculo de punto fijo. ¿Cuántos bits de precisión utilizan los sistemas de punto fijo típicos? ¿Es posible hacer cálculos de punto fijo de manera eficiente, con, digamos, 64 bits ( parte entera de 16 bits, parte fraccionaria de 48 bits ) en x86-64?
Siempre pensé que los cálculos de punto fijo se usaban solo en situaciones donde la potencia de la CPU es limitada. ¿Tiene sentido usar cálculos de punto fijo cuando la potencia de la CPU no es una preocupación?
fuente
Respuestas:
La precisión numérica de los enteros solo será mejor que la precisión numérica de los flotantes si la resolución entera es mejor. Los dobles tienen 52 bits fraccionarios, por lo que los flotadores de doble precisión tienen una resolución peor que los enteros en torno a , que es mucho mayor que 32768 ( 2 15 ). Entonces, no, la precisión numérica no será mejor si vas a enteros.252 215
El segundo problema es la velocidad. La respuesta es: depende del hardware. Si está ejecutando su programa en un procesador de señal digital que tiene múltiples puntos de multiplicación / acumulación de punto fijo, entonces sí, será mucho más rápido en punto fijo. En un chip x86, por otro lado, en realidad probablemente será más lento en punto fijo. Hice exactamente de lo que estás hablando una vez y vi aumentar los tiempos de ejecución.
Después de hacer algunas búsquedas en Internet descubrí que eso es común. La razón es porque tiene un procesador de punto flotante dedicado que no hace nada cuando hace la transición a punto fijo, mientras que el hardware de punto fijo se comparte con la acción regular de punto fijo, como la aritmética de puntero.
Si desea acelerar el procesamiento, la forma de hacerlo es cambiar de flotadores de doble precisión a flotadores de precisión simple. Eso debería producir un aumento significativo en la velocidad. Sin embargo, eso reduciría su precisión numérica.
fuente
Los méritos del punto fijo son principalmente en términos de potencia (como cuando tiene la opción de elegir un hardware de procesador, o el procesador es bueno para apagar las unidades funcionales no utilizadas). Esto se debe a que las unidades de punto fijo suelen ser más pequeñas (menos transistores, cables más cortos, menos capacitancia para superar por MAC) para una tecnología determinada y una tasa de emisión de operación, que el punto flotante.
Sin embargo, una gran cantidad de procesadores contemporáneos comunes (servidor, PC e incluso dispositivos móviles) tienen más y más rápidas FPU (especialmente unidades de FP de precisión simple) que los multiplicadores enteros, y la mayor parte de la potencia del sistema no proviene del uso de la FPU, por lo tanto, el uso de -point tendrá pocas o ninguna ventaja para el cómputo DSP típico en estos productos, y probablemente sea una desventaja en términos de rendimiento puro. Usando la tecnología actual, cualquier ventaja para el punto fijo se acumulará principalmente en pequeños productos integrados, como dispositivos del tamaño de un botón.
Sin embargo, también tenga en cuenta las huellas de memoria y caché del procesador. El uso inteligente de tipos de datos más pequeños (int corto y flotante) para ajustar completamente un gran cálculo en la memoria caché de datos puede compensar cualquier ventaja de ancho de banda de FPU puro.
fuente
Prefiera flotantes de precisión individuales a dobles: esto reducirá a la mitad el ancho de banda de memoria, la huella de caché y los requisitos de almacenamiento, y hará que algunas operaciones matemáticas sean más rápidas. También abre la posibilidad de SIMD de 4 vías si se necesita una mayor optimización.
El punto fijo solo vale la pena cuando no tiene una FPU: la mayoría de las CPU x86 modernas tienen dos FPU, por lo que no se gana nada con el uso del punto fijo, y el rendimiento puede ser significativamente peor con el punto fijo. (Tenga en cuenta también que el punto fijo requiere instrucciones adicionales en comparación con el punto flotante para operaciones como la multiplicación).
fuente
Además de las muy buenas respuestas proporcionadas aquí, vale la pena agregar algunas cosas:
fuente
Algunos puntos a considerar:
Como última palabra, creo que nuestros datos del mundo real son preciosos y el cálculo numérico ciego de la computadora es un trabajo humilde y servil. La computadora debe ponerse a hacer el trabajo pesado para sus datos y para usted, y no debe ser tratada como si fuera la verdadera estrella en el programa.
fuente