stringtranslate.com

Número subnormal

Un sistema de punto flotante no aumentado contendría únicamente números normalizados (indicados en rojo). Al permitir números desnormalizados (azul), se amplía el rango del sistema.

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

Terminología

En algunos documentos más antiguos (especialmente documentos de estándares como las versiones iniciales de IEEE 754 y el lenguaje C ), "denormal" 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 no es capaz de representar ningún otro número desnormalizado, pero en la discusión aquí se utiliza el término "subnormal" de acuerdo con la revisión de 2008 de IEEE 754. En discusiones informales, los términos subnormal y denormal se utilizan a menudo 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. Se puede utilizar "representación" en lugar de "número" cuando se requiere claridad.

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 , denormales o anormales por su relación con la normal .

En un valor de punto flotante normal , no hay ceros a la izquierda en la mantisa (también llamada comúnmente mantisa); en su lugar, 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 punto flotante desnormalizado tiene una mantisa 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 representable más pequeño (el exponente tiene un rango limitado).

El mantisa (o significando) 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 un radix binario , el dígito binario principal siempre es 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 ), 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 punto flotante puede reconocerse como subnormal siempre que su exponente sea el menor valor posible.

Al llenar el espacio de desbordamiento de esta manera, se pierden dígitos significativos, pero no tan abruptamente como cuando se utiliza el enfoque de vaciado a cero en caso de desbordamiento (descartando todos los dígitos significativos cuando se alcanza el desbordamiento). 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 desnormalizados se denominan 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 una codificación especial porque el formato admite números no normalizados directamente.

Matemáticamente hablando, los números de punto flotante normalizados de un signo determinado están espaciados aproximadamente de forma logarítmica y, como tal, cualquier flotante normal de tamaño finito no puede incluir cero . Los flotantes subnormales son un conjunto de valores espaciados linealmente, que abarcan la brecha entre los flotantes normales negativos y positivos.

Fondo

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

Los números subnormales se implementaron en el Intel 8087 mientras se escribía el estándar IEEE 754. Fueron, con diferencia, la característica más controvertida de la propuesta de formato KCS que finalmente se adoptó, [2] pero esta implementación demostró que se podían admitir números subnormales en una implementación práctica. Algunas implementaciones de unidades de punto flotante no admiten directamente números subnormales en hardware, sino que se basan en algún tipo de compatibilidad de software. Si bien esto puede ser transparente para el usuario, puede dar lugar a que los cálculos que producen o consumen números subnormales sean mucho más lentos que los cálculos similares sobre números normales.

IEEE

En los formatos de punto flotante binario IEEE , los subnormales se representan mediante un campo de exponente cero con un campo de significando 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 subnormales al software del sistema ("asistencia"), manejando únicamente valores normales y cero en hardware. El manejo de valores subnormales en software siempre conduce a una disminución significativa en el rendimiento. Cuando los valores subnormales se calculan completamente en hardware, existen técnicas de implementación que permiten su procesamiento a velocidades comparables a 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 contenido de una página de otro sitio dentro de un navegador web. [7]

Algunas aplicaciones necesitan incluir código para evitar números subnormales, ya sea para mantener la precisión o para evitar la penalización de rendimiento en algunos procesadores. Por ejemplo, en aplicaciones de procesamiento de audio, los valores subnormales suelen representar una señal tan baja que está fuera del rango de audición humana. Debido a esto, una medida común para evitar valores subnormales en procesadores donde habría una penalización de rendimiento es reducir la señal a cero una vez que alcanza niveles subnormales o mezclarla con una señal de ruido extremadamente baja. [8] Otros métodos para prevenir números subnormales incluyen agregar un desfase de CC, cuantificar números, agregar una señal de Nyquist, etc. [9] Desde la extensión del procesador SSE2 , Intel ha proporcionado una funcionalidad de este tipo en el hardware de la CPU, que redondea los números subnormales a cero. [10]

Deshabilitar flotantes 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 flotante subnormal para operaciones que darían como resultado un flotante subnormal, incluso si los argumentos de entrada no son en sí mismos subnormales. clang y gcc tienen diferentes estados predeterminados según la plataforma y el nivel de optimización.

A continuación se ofrece un método no compatible con C99 para habilitar los indicadores DAZy FTZen los destinos que admiten SSE, pero no cuenta con una amplia aceptación. Se sabe que funciona en Mac OS X desde al menos 2006. [12]

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

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

#include <xmmintrin.h> _mm_setcsr ( _mm_getcsr ( ) | 0x0040 ) ; // Zona de libre comercio _mm_setcsr ( _mm_getcsr () | 0x8000 ) ; // Zona libre de comercio _mm_setcsr ( _mm_getcsr () | 0x8040 ); // Ambos _mm_setcsr ( _mm_getcsr () y ~ 0x8040 ); // Deshabilitar ambos             

Las macros _MM_SET_DENORMALS_ZERO_MODEy _MM_SET_FLUSH_ZERO_MODEenvuelven 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):

#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() y ~_MM_DENORMALS_ZERO_MASK) | (modo)) #define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() y _MM_DENORMALS_ZERO_MASK)

El comportamiento de desnormalización predeterminado está determinado por la ABI y, por lo tanto, un software que funcione bien debe guardar y restaurar el modo de desnormalización antes de regresar al llamador o al código de llamada en otras bibliotecas.

BRAZO

La FPU AArch32 NEON (SIMD) siempre utiliza un modo de vaciado a cero [ cita requerida ] , que es el 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 FZbit del registro de control: FPSCR en Arm32 y FPCR en AArch64. [15]

Una forma de hacerlo puede ser:

#if definido(__arm64__) || definido(__aarch64__) uint64_t fpcr ; asm ( "mrs %0, fpcr" : "=r" ( fpcr )); //Cargar el registro FPCR asm ( "msr fpcr, %0" :: "r" ( fpcr | ( 1 << 24 ) )); //Establecer el bit 24 (FTZ) en 1 #endif                    

Algunos procesadores ARM tienen manejo de hardware de subnormales.

Véase 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. ^ "Entrevista con el anciano del punto flotante". Universidad de California, Berkeley.
  3. ^ "Números desnormalizados". Caldera International . Consultado el 11 de octubre de 2023 .(Tenga en cuenta que la documentación de XenuOS usa denormal donde IEEE 754 usa subnormal ).
  4. ^ Schwarz, EM; Schmookler, M.; Son Dao Trong (julio de 2005). "Implementaciones de FPU con números desnormalizados" (PDF) . IEEE Transactions on Computers . 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 subnormales" (PDF) . Consultado el 30 de noviembre de 2010 .
  6. ^ Fog, 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; Mowery, Keaton; Jhala, Ranjit; Lerner, Sorin; Shacham, Hovav. "Sobre el punto flotante subnormal y la temporización anormal" (PDF) . Consultado el 5 de octubre de 2015 .
  8. ^ Serris, John (16 de abril de 2002). «Desnormalización del 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 desnormalizados en aplicaciones de procesamiento de señales de punto flotante" (PDF) .
  10. ^ 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 .
  11. ^ "Biblioteca Intel® MPI: documentación". Intel.
  12. ^ "Re: Problema de rendimiento de la MacBook Pro". Apple Inc. Archivado desde el original el 26 de agosto de 2016.
  13. ^ "Re: Cambiar el estado de punto flotante (antes: rendimiento de punto flotante vs. doble)". Archivado desde el original el 15 de enero de 2014 . Consultado el 24 de enero de 2013 .
  14. ^ "Guía del usuario del compilador de C++ para sistemas Linux*". Intel.
  15. ^ "Registros Aarch64". Brazo.

Lectura adicional