En ciencias de la computación , los números desnormalizados o los números desnormalizados (ahora llamados a menudo números subnormales ) llenan el espacio de subdesbordamiento alrededor de cero en aritmética de punto flotante . Cualquier número distinto de cero con una magnitud menor que el número normal más pequeño es subnormal .
En un valor de coma flotante normal, no hay ceros a la izquierda en el significado ; más bien, los ceros iniciales se eliminan ajustando el exponente (por ejemplo, el número 0.0123 se escribiría como 1.23 × 10 −2 ). Los números desnormales son números en los que esta representación daría como resultado un exponente que está por debajo del exponente representable más pequeño (el exponente generalmente tiene un rango limitado). Estos números se representan utilizando ceros a la izquierda en el significado.
El significado (o mantisa) de un número de coma flotante IEEE es la parte de un número de coma flotante que representa los dígitos significativos . Para un número normalizado positivo, se puede representar como m 0 . m 1 m 2 m 3 ... m p −2 m p −1 (donde m representa un dígito significativo yp es la precisión) con m 0 distinto de cero . Observe que para una base binaria , el dígito binario inicial es siempre 1. En un número desnormal, dado que el exponente es el mínimo que puede ser, cero es el dígito significativo inicial (0. m 1 m 2 m 3 ... m p −2 m p −1 ), lo que permite la representación de números más cercanos a cero que el número normal más pequeño. Un número de coma flotante puede reconocerse como desnormal siempre que su exponente sea el menor valor posible.
Al llenar la brecha de subdesbordamiento de esta manera, se pierden dígitos significativos, pero no tan abruptamente como cuando se usa el rasante a cero en el enfoque de subdesbordamiento (descartando todos los dígitos significativos cuando se alcanza el subdesbordamiento). Por lo tanto, la producción de un número desnormal a veces se denomina subdesbordamiento gradual porque permite que un cálculo pierda precisión lentamente cuando el resultado es pequeño.
En IEEE 754-2008 , los números desnormales se renombran como números subnormales y se admiten tanto en formato binario como decimal. En los formatos de intercambio binario, los números subnormales se codifican con un exponente sesgado de 0, pero se interpretan con el valor del exponente más pequeño permitido, que es uno mayor (es decir, como si estuviera codificado como 1). En los formatos de intercambio decimal, no requieren codificación especial porque el formato admite números no normalizados directamente.
Hablando matemáticamente, los números de coma flotante normalizados de un signo dado están espaciados aproximadamente logarítmicamente y, como tal, cualquier flotante normal de tamaño finito no puede incluir cero . Los flotadores desnormales son un conjunto de valores espaciados linealmente, que abarcan el espacio entre los flotadores normales negativos y positivos.
Fondo
Los números desnormales brindan la garantía de que la suma y resta de números de punto flotante nunca se desborde; dos números de coma flotante cercanos siempre tienen una diferencia representable distinta de cero. Sin subdesbordamiento gradual, la resta a - b puede subdesbordar y producir cero aunque los valores no sean iguales. Esto, a su vez, puede llevar a una división por cero errores que no pueden ocurrir cuando se usa un flujo de agua bajo gradual. [1]
Los números desnormales se implementaron en Intel 8087 mientras se escribía el estándar IEEE 754. Fueron, con mucho, la característica más controvertida en la propuesta de formato KCS que finalmente se adoptó, [2] pero esta implementación demostró que los desnormales pueden ser compatibles con una implementación práctica. Algunas implementaciones de unidades de punto flotante no admiten directamente números desnormales en el hardware, sino que atrapan algún tipo de soporte de software. Si bien esto puede ser transparente para el usuario, puede resultar en que los cálculos que producen o consumen números desnormales sean mucho más lentos que cálculos similares en números normales.
Problemas de desempeño
Algunos sistemas manejan valores desnormales en hardware, de la misma forma que los valores normales. Otros dejan el manejo de valores desnormales al software del sistema ("asistencia"), solo manejando valores normales y cero en hardware. El manejo de valores desnormales en el software siempre conduce a una disminución significativa del rendimiento. Cuando los valores desnormales se calculan completamente en hardware, existen técnicas de implementación para permitir su procesamiento a velocidades comparables a los números normales. [3] Sin embargo, la velocidad de cálculo permanece significativamente reducida en muchos procesadores x86 modernos; en casos extremos, las instrucciones que involucran operandos desnormales pueden correr hasta 100 veces más lento. [4] [5]
Esta diferencia de velocidad puede suponer un riesgo para la seguridad. Los investigadores demostraron que proporciona un canal lateral de sincronización que permite que un sitio web malintencionado extraiga el contenido de la página de otro sitio dentro de un navegador web. [6]
Algunas aplicaciones necesitan contener código para evitar números desnormales, ya sea para mantener la precisión o para evitar la penalización del rendimiento en algunos procesadores. Por ejemplo, en aplicaciones de procesamiento de audio, los valores desnormales generalmente representan una señal tan silenciosa que está fuera del rango auditivo humano. Debido a esto, una medida común para evitar desnormalidades en procesadores donde habría una penalización de rendimiento es cortar la señal a cero una vez que alcanza niveles desnormales o mezclar en una señal de ruido extremadamente silenciosa. [7] Otros métodos para prevenir los números desnormales incluyen agregar un desplazamiento de CC, cuantificar números, agregar una señal de Nyquist, etc. [8] Desde la extensión del procesador SSE2 , Intel ha proporcionado dicha funcionalidad en el hardware de la CPU, que redondea los números desnormalizados a cero. . [9]
Deshabilitar los flotadores desnormales a nivel de código
Intel SSE
Los compiladores Intel C y Fortran habilitan los indicadores denormals-are-zero (DAZ) y flush-to-zero (FTZ) para SSE de forma predeterminada para niveles de optimización superiores a -O0
. [10] El efecto de DAZ es tratar los argumentos de entrada desnormal a las operaciones de punto flotante como cero, y el efecto de FTZ es devolver cero en lugar de un flotador denormal para operaciones que resultarían en un flotador desnormal, incluso si los argumentos de entrada no son en sí mismos desnormales. clang y gcc tienen diferentes estados predeterminados según la plataforma y el nivel de optimización.
A continuación se proporciona un método que no cumple con C99 para habilitar los indicadores DAZ y FTZ en objetivos que admiten SSE, pero no es ampliamente compatible. Se sabe que funciona en Mac OS X desde al menos 2006. [11]
#include #pragma STDC FENV_ACCESS ON // Establece DAZ y FTZ, superando otras configuraciones de CSR. // Ver https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c y fenv.h. fesetenv ( FE_DFL_DISABLE_SSE_DENORMS_ENV ); // fesetenv (FE_DFL_ENV) // Desactiva ambos, superando otras configuraciones de CSR.
Para otras plataformas de conjuntos de instrucciones SSE donde la biblioteca C aún no ha implementado el indicador anterior, lo siguiente puede funcionar: [12]
#include _mm_setcsr ( _mm_getcsr () | 0x0040 ); // DAZ _mm_setcsr ( _mm_getcsr () | 0x8000 ); // FTZ _mm_setcsr ( _mm_getcsr () | 0x8040 ); // Ambos _mm_setcsr ( _mm_getcsr () y ~ 0x8040 ); // Deshabilitar ambos
Las macros _MM_SET_DENORMALS_ZERO_MODE
y _MM_SET_FLUSH_ZERO_MODE
envuelven una interfaz más legible para el código anterior. [13]
// Para habilitar DAZ #include _MM_SET_DENORMALS_ZERO_MODE ( _MM_DENORMALS_ZERO_ON ); // Para habilitar FTZ #include _MM_SET_FLUSH_ZERO_MODE ( _MM_FLUSH_ZERO_ON );
La mayoría de los compiladores ya proporcionarán la macro anterior de forma predeterminada; de lo contrario, se puede utilizar el siguiente fragmento de código (la definición de FTZ es análoga):
#define _MM_DENORMALS_ZERO_MASK 0x0040 #define _MM_DENORMALS_ZERO_ON 0x0040 #define _MM_DENORMALS_ZERO_OFF 0x0000#define _MM_SET_DENORMALS_ZERO_MODE (modo) \ _mm_setcsr ((_ mm_getcsr () & ~ _MM_DENORMALS_ZERO_MASK) | (modo)) #define _MM_GET_DENORMALS_ZERO_MODE () \ (_)
El comportamiento denormal predeterminado es ABI y, por lo tanto, el software que se comporta bien debe guardar y restaurar el modo desnormal antes de regresar a la persona que llama o llamar al código desprevenido de la biblioteca / sistema operativo.
BRAZO
AArch32 NEON (SIMD) FPU siempre usa un modo de descarga a cero, que es lo mismo que FTZ + DAZ. Para la FPU escalar y en el SIMD AArch64, el comportamiento de vaciado a cero es opcional y está controlado por el bit FZ del registro de control: FPSCR en Arm32 y FPCR en AArch64.
Algunos procesadores ARM tienen manejo de hardware de desnormales.
Ver también
Referencias
- ^ William Kahan. "Actas de la reunión IEEE 754R, 2002" . Archivado desde el original el 15 de octubre de 2016 . Consultado el 29 de diciembre de 2013 .
- ^ "Una entrevista con el anciano de Floating-Point" . Universidad de California, Berkeley.
- ^ Schwarz, EM; Schmookler, M .; Son Dao Trong (julio de 2005). "Implementaciones FPU con números desnormalizados" (PDF) . Transacciones IEEE en computadoras . 54 (7): 825–836. doi : 10.1109 / TC.2005.118 . S2CID 26470540 .
- ^ Dooley, Isaac; Kale, Laxmikant (12 de septiembre de 2006). "Cuantificación de la interferencia causada por valores subnormales de punto flotante" (PDF) . Consultado el 30 de noviembre de 2010 .
- ^ Niebla, Agner. "Tablas de instrucciones: listas de latencias de instrucción, rendimientos y desgloses de microoperaciones para CPU Intel, AMD y VIA" (PDF) . Consultado el 25 de enero de 2011 .
- ^ Andrysco, Marc; Kohlbrenner, David; Mowery, Keaton; Jhala, Ranjit; Lerner, Sorin; Shajam, Hovav. "Sobre punto flotante subnormal y sincronización anormal" (PDF) . Consultado el 5 de octubre de 2015 .
- ^ Serris, John (16 de abril de 2002). "Desormalización de Pentium 4: picos de CPU en aplicaciones de audio" . Archivado desde el original el 25 de febrero de 2012 . Consultado el 29 de abril de 2015 .
- ^ de Soras, Laurent (19 de abril de 2005). "Números denormales en aplicaciones de procesamiento de señales de punto flotante" (PDF) .
- ^ Casey, Shawn (16 de octubre de 2008). "Asistencias de punto flotante x87 y SSE en IA-32: Flush-To-Zero (FTZ) y Denormals-Are-Zero (DAZ)" . Consultado el 3 de septiembre de 2010 .
- ^ "Biblioteca Intel® MPI - Documentación" . Intel.
- ^ "Re: problema de rendimiento de Macbook pro" . Apple Inc. Archivado desde el original el 26 de agosto de 2016.
- ^ "Re: cambio de estado de punto flotante (era: rendimiento doble frente a flotante)" . Apple Inc. Archivado desde el original el 15 de enero de 2014 . Consultado el 24 de enero de 2013 .
- ^ "Guía del usuario del compilador C ++ para sistemas Linux *" . Intel.
Otras lecturas
- Eric Schwarz, Martin Schmookler y Son Dao Trong (junio de 2003). "Implementaciones de hardware de números desnormalizados" (PDF) . Actas 16º Simposio del IEEE sobre aritmética informática (Arith16) . 16º Simposio IEEE sobre Aritmética Informática . Sociedad de Informática IEEE . págs. 104-111. ISBN 0-7695-1894-X.[ enlace muerto permanente ]
Consulte también varios artículos en el sitio web de William Kahan [1] para ver ejemplos de dónde los números desnormales ayudan a mejorar los resultados de los cálculos.