stringtranslate.com

Número subnormal

Esta página describe números subnormales en general. Para obtener detalles sobre los números anormales y subnormales de IEEE, consulte la sección IEEE a continuación.
Un sistema de punto flotante no aumentado contendría sólo números normalizados (indicados en rojo). Permitir números desnormalizados (azul) amplía el alcance del sistema.

En informática , los números subnormales son el subconjunto de números desnormalizados (a veces llamados denormales ) que llenan el espacio de subflujo alrededor del cero en la aritmética de punto flotante . Cualquier número distinto de cero con magnitud menor que el número normal positivo más pequeño es subnormal , mientras que denormal también puede referirse a números fuera de ese rango.

Terminología

En algunos documentos más antiguos (especialmente documentos estándar como las versiones iniciales de IEEE 754 y el lenguaje C ), "desnormal" se utiliza para referirse exclusivamente a números subnormales. Este uso persiste en varios documentos de estándares, especialmente cuando se habla de hardware que es incapaz de representar otros números desnormalizados, pero la discusión aquí usa el término "subnormal" de acuerdo con la revisión de 2008 de IEEE 754 . En discusiones informales, los términos subnormal y denormal a menudo se usan indistintamente, en parte porque no hay números binarios IEEE desnormalizados fuera del rango subnormal.

El término "número" se utiliza de manera bastante vaga para describir una secuencia particular de dígitos, en lugar de una abstracción matemática; consulte Punto flotante para obtener detalles sobre cómo se relacionan los números reales con las representaciones de punto flotante. Cuando se requiera claridad, podrá utilizarse "representación" en lugar de "número".

Definición

Los números reales matemáticos pueden aproximarse mediante múltiples representaciones de punto flotante. Una representación se define como normal y otras se definen como subnormales , desnormales o anormales por su relación con lo normal .

En un valor de punto flotante normal , no hay ceros a la izquierda en el significado (también llamado comúnmente mantisa); más bien, los ceros a la izquierda se eliminan ajustando el exponente (por ejemplo, el número 0,0123 se escribiría como 1,23 × 10 −2 ). Por el contrario, un valor de coma flotante desnormalizado tiene un significado con un dígito inicial de cero. De estos, los números subnormales representan valores que, si se normalizaran, tendrían exponentes por debajo del exponente más pequeño representable (el exponente tiene un rango limitado).

El significado (o mantisa) de un número de punto flotante IEEE es la parte de un número de punto 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 y p es la precisión) con m 0 distinto de cero . Observe que para una base binaria , el dígito binario principal es siempre 1. En un número subnormal, dado que el exponente es el menor que puede ser, cero es el dígito significativo principal (0. m 1 m 2 m 3 ... m p −2 m p −1 ), permitiendo 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 subnormal siempre que su exponente sea el menor valor posible.

Al llenar el espacio de subdesbordamiento de esta manera, se pierden dígitos significativos, pero no tan abruptamente como cuando se usa el enjuague 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 subnormal a veces se denomina desbordamiento gradual porque permite que un cálculo pierda precisión lentamente cuando el resultado es pequeño.

En IEEE 754-2008 , los números anormales pasan a llamarse 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 un 1). En los formatos de intercambio decimal no requieren codificación especial porque el formato admite directamente números no normalizados.

Matemáticamente hablando, 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 subnormales son un conjunto de valores espaciados linealmente, que abarcan la brecha entre los flotadores normales negativos y positivos.

Fondo

Los números anormales brindan la garantía de que la suma y resta de números de punto flotante nunca fallan; dos números de coma flotante cercanos siempre tienen una diferencia representable distinta de cero. Sin un desbordamiento gradual, la resta a  −  b puede desbordarse y producir cero aunque los valores no sean iguales. Esto, a su vez, puede conducir a errores de división por cero que no pueden ocurrir cuando se utiliza un desbordamiento gradual. [1]

Se implementaron números anormales en el 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 números subnormales podrían admitirse en una implementación práctica. Algunas implementaciones de unidades de punto flotante no soportan directamente números subnormales en el hardware, sino que atrapan algún tipo de soporte de software. Si bien esto puede ser transparente para el usuario, puede dar como resultado que los cálculos que producen o consumen números anormales sean mucho más lentos que cálculos similares con números normales.

IEEE

En los formatos de punto flotante binario IEEE , las subnormales se representan teniendo un campo de exponente cero con un campo de significado distinto de cero. [3]

No existen otros números desnormalizados en los formatos de punto flotante binario IEEE, pero existen en algunos otros formatos, incluidos los formatos de punto flotante decimal IEEE.

Problemas de rendimiento

Algunos sistemas manejan valores subnormales en hardware, de la misma manera que los valores normales. Otros dejan el manejo de valores anormales al software del sistema ("asistencia"), manejando solo valores normales y cero en el hardware. El manejo de valores subnormales en el software siempre conduce a una disminución significativa del rendimiento. Cuando los valores subnormales se calculan íntegramente en hardware, existen técnicas de implementación que permiten su procesamiento a velocidades comparables a las de los números normales. [4] Sin embargo, la velocidad de cálculo sigue siendo significativamente reducida en muchos procesadores x86 modernos; En casos extremos, las instrucciones que involucran operandos subnormales pueden tomar hasta 100 ciclos de reloj adicionales, lo que hace que las instrucciones más rápidas se ejecuten hasta seis veces más lento. [5] [6]

Esta diferencia de velocidad puede suponer un riesgo para la seguridad. Los investigadores demostraron que proporciona un canal lateral de sincronización que permite a un sitio web malicioso extraer el contenido de la página de otro sitio dentro de un navegador web. [7]

Algunas aplicaciones necesitan contener código para evitar números anormales, ya sea para mantener la precisión o para evitar la pérdida de rendimiento en algunos procesadores. Por ejemplo, en aplicaciones de procesamiento de audio, los valores subnormales suelen representar una señal tan silenciosa que está fuera del alcance del oído humano. Debido a esto, una medida común para evitar niveles subnormales en procesadores donde habría una penalización en el rendimiento es cortar la señal a cero una vez que alcance niveles subnormales o mezclar una señal de ruido extremadamente silenciosa. [8] Otros métodos para prevenir números anormales incluyen agregar un desplazamiento de CC, cuantificar números, agregar una señal Nyquist, etc. [9] Desde la extensión del procesador SSE2 , Intel ha proporcionado dicha funcionalidad en el hardware de la CPU, que redondea los números anormales a cero. . [10]

Deshabilitar flotadores subnormales a nivel de código

Intel SSE

Los compiladores C y Fortran de Intel habilitan los indicadores DAZ(denormals-are-zero) y FTZ(flush-to-zero) para SSE de forma predeterminada para niveles de optimización superiores a -O0. [11] El efecto de DAZes tratar los argumentos de entrada subnormales para operaciones de punto flotante como cero, y el efecto de FTZes devolver cero en lugar de un valor flotante anormal para operaciones que darían como resultado un valor flotante anormal, incluso si los argumentos de entrada no son ellos mismos subnormales. 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 las banderas DAZy en objetivos que admiten SSE, pero no cuenta con un respaldo generalizado. FTZSe sabe que funciona en Mac OS X desde al menos 2006. [12]

#include <fenv.h> #pragma STDC FENV_ACCESS ON // Establece DAZ y FTZ, afectando otras configuraciones de CSR. // Consulte 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) // Deshabilita ambos, afectando otras configuraciones de CSR. 

Para otras plataformas x86-SSE donde la biblioteca C aún no ha implementado este indicador, lo siguiente puede funcionar: [13]

#include <xmmintrin.h> _mm_setcsr ( _mm_getcsr () | 0x0040 ); // DAZ _mm_setcsr ( _mm_getcsr () | 0x8000 ); // FTZ _mm_setcsr ( _mm_getcsr () | 0x8040 ); // Ambos _mm_setcsr ( _mm_getcsr () & ~ 0x8040 ); // Deshabilitar ambos             

Las _MM_SET_DENORMALS_ZERO_MODEmacros _MM_SET_FLUSH_ZERO_MODEy envuelven una interfaz más legible para el código anterior. [14]

// Para habilitar DAZ #include <pmmintrin.h> _MM_SET_DENORMALS_ZERO_MODE ( _MM_DENORMALS_ZERO_ON ); // Para habilitar FTZ #include <xmmintrin.h> _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):

#definir _MM_DENORMALS_ZERO_MASK 0x0040 #definir _MM_DENORMALS_ZERO_ON 0x0040 #definir _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() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)

El comportamiento de desnormalización predeterminado lo exige la ABI y, por lo tanto, el software con buen comportamiento debe guardar y restaurar el modo de desnormalización antes de regresar a la persona que llama o llamar al código en otras bibliotecas.

BRAZO

La FPU AArch32 NEON (SIMD) siempre utiliza 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 descarga a cero es opcional y está controlado por el FZbit del registro de control: FPSCR en Arm32 y FPCR en AArch64. [15]

Una forma de hacer esto puede ser:

#si está definido(__arm64__) || definido(__aarch64__) uint64_t fpcr ; asm ( "señora %0, fpcr" : "=r" ( fpcr )); //Carga el registro FPCR asm ( "msr fpcr, %0" :: "r" ( fpcr | ( 1 << 24 ) )); //Establece el bit 24 (FTZ) en 1 #endif                    

Algunos procesadores ARM tienen hardware para manejar subnormales.

Ver también

Notas

Referencias

  1. ^ 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 .
  2. ^ "Una entrevista con el viejo del punto flotante". Universidad de California, Berkeley.
  3. ^ "Números desnormalizados". Caldera Internacional . Consultado el 11 de octubre de 2023 .(Tenga en cuenta que la documentación de XenuOS usa denormal mientras que IEEE 754 usa subnormal ).
  4. ^ Schwarz, EM; Schmookler, M.; Son Dao Trong (julio de 2005). "Implementaciones de FPU con números desnormalizados" (PDF) . Transacciones IEEE en computadoras . 54 (7): 825–836. doi :10.1109/TC.2005.118. S2CID  26470540.
  5. ^ Dooley, Isaac; Kale, Laxmikant (12 de septiembre de 2006). "Cuantificación de la interferencia causada por valores de coma flotante anormales" (PDF) . Consultado el 30 de noviembre de 2010 .
  6. ^ Niebla, Agner. "Tablas de instrucciones: listas de latencias de instrucciones, rendimientos y desgloses de microoperaciones para CPU Intel, AMD y VIA" (PDF) . Consultado el 25 de enero de 2011 .
  7. ^ Andrysco, Marc; Kohlbrenner, David; Cortacésped, Keaton; Jhala, Ranjit; Lerner, Sorin; Shacham, Hovav. "Sobre punto flotante anormal y sincronización anormal" (PDF) . Consultado el 5 de octubre de 2015 .
  8. ^ Serris, John (16 de abril de 2002). "Desnormalizació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 .
  9. ^ de Soras, Laurent (19 de abril de 2005). "Números anormales en aplicaciones de procesamiento de señales de punto flotante" (PDF) .
  10. ^ Casey, Shawn (16 de octubre de 2008). "Asistencias de coma flotante x87 y SSE en IA-32: Flush-To-Zero (FTZ) y Denormals-Are-Zero (DAZ)" . Consultado el 3 de septiembre de 2010 .
  11. ^ "Biblioteca Intel® MPI: documentación". Intel.
  12. ^ "Re: problema de rendimiento de Macbook pro". Apple Inc. Archivado desde el original el 26 de agosto de 2016.
  13. ^ "Re: Cambiar el estado de coma 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 .
  14. ^ "Guía del usuario del compilador C++ para sistemas Linux*". Intel.
  15. ^ "Registros Aarch64". Brazo.

Lectura adicional