En informática , la precisión media (a veces llamada FP16 o float16 ) es un formato numérico binario de punto flotante que ocupa 16 bits (dos bytes en las computadoras modernas) en la memoria de la computadora . Está destinado al almacenamiento de valores de punto flotante en aplicaciones donde no es esencial una mayor precisión, en particular el procesamiento de imágenes y las redes neuronales .
Casi todos los usos modernos siguen el estándar IEEE 754-2008 , donde el formato de base 2 de 16 bits se denomina binary16 y el exponente utiliza 5 bits. Esto puede expresar valores en el rango ±65,504, siendo el valor mínimo por encima de 1 1 + 1/1024.
Dependiendo de la computadora, la media precisión puede ser un orden de magnitud más rápida que la doble precisión, por ejemplo, 550 PFLOPS para la media precisión frente a 37 PFLOPS para la doble precisión en un proveedor de nube. [1]
Han existido varios formatos de punto flotante de 16 bits anteriores, incluido el del DSP HD61810 de Hitachi de 1982 (un exponente de 4 bits y una mantisa de 12 bits), [2] el WIF de Thomas J. Scott de 1991 (5 bits de exponente, 10 bits de mantisa) [3] y el procesador de gráficos 3dfx Voodoo de 1995 (el mismo que Hitachi). [4]
ILM buscaba un formato de imagen que pudiera manejar un amplio rango dinámico , pero sin el costo de memoria y disco duro del punto flotante de precisión simple o doble. [5] El grupo de sombreado programable acelerado por hardware dirigido por John Airey en SGI (Silicon Graphics) utilizó el tipo de datos s10e5 en 1997 como parte del esfuerzo de diseño 'bali'. Esto se describe en un artículo de SIGGRAPH 2000 [6] (ver sección 4.3) y se documenta con más detalle en la patente estadounidense 7518615. [7] Se popularizó por su uso en el formato de imagen de código abierto OpenEXR .
Nvidia y Microsoft definieron el tipo de datos half en el lenguaje Cg , lanzado a principios de 2002, y lo implementaron en silicio en la GeForce FX , lanzada a fines de 2002. [8] Sin embargo, el soporte de hardware para el punto flotante acelerado de 16 bits fue posteriormente abandonado por Nvidia antes de ser reintroducido en la GPU móvil Tegra X1 en 2015.
La extensión F16C en 2012 permite a los procesadores x86 convertir flotantes de media precisión en y desde flotantes de precisión simple con una instrucción de máquina.
El estándar IEEE 754 [9] especifica que un binario16 tiene el siguiente formato:
El formato se presenta de la siguiente manera:
Se supone que el formato tiene un bit de entrada implícito con valor 1 a menos que el campo de exponente se almacene con todos los ceros. Por lo tanto, solo aparecen 10 bits de la mantisa en el formato de memoria, pero la precisión total es de 11 bits. En el lenguaje IEEE 754, hay 10 bits de mantisa, pero hay 11 bits de precisión de mantisa (log 10 (2 11 ) ≈ 3,311 dígitos decimales, o 4 dígitos ± ligeramente menos de 5 unidades en el último lugar ).
El exponente de punto flotante binario de media precisión se codifica utilizando una representación binaria de desplazamiento , donde el desplazamiento cero es 15; también conocido como sesgo de exponente en el estándar IEEE 754. [9]
Por lo tanto, tal como lo define la representación binaria de desplazamiento, para obtener el exponente verdadero, el desplazamiento de 15 debe restarse del exponente almacenado.
Los exponentes almacenados 00000 2 y 11111 2 se interpretan de forma especial.
El valor mínimo estrictamente positivo (subnormal) es 2 −24 ≈ 5,96 × 10 −8 . El valor mínimo positivo normal es 2 −14 ≈ 6,10 × 10 −5 . El valor máximo representable es (2−2 −10 ) × 2 15 = 65504.
Estos ejemplos se dan en representación de bits del valor de punto flotante. Esto incluye el bit de signo, el exponente (sesgado) y la mantisa.
De manera predeterminada, 1/3 se redondea hacia abajo como en el caso de precisión doble , debido a la cantidad impar de bits en la mantisa. Los bits que se encuentran más allá del punto de redondeo son 0101 ... que es menos de 1/2 de una unidad en el último lugar .
Los números 65520 y superiores se redondean al infinito. Esto es para redondear a pares; otras estrategias de redondeo cambiarán este límite.
Los procesadores ARM admiten (a través de un bit de registro de control de punto flotante ) un formato de "media precisión alternativa", que elimina el caso especial de un valor de exponente de 31 (11111 2 ). [10] Es casi idéntico al formato IEEE, pero no hay codificación para infinito o NaN; en cambio, un exponente de 31 codifica números normalizados en el rango de 65536 a 131008.
La precisión media se utiliza en varios entornos de gráficos de computadora para almacenar píxeles, incluidos MATLAB , OpenEXR , JPEG XR , GIMP , OpenGL , Vulkan , [11] Cg , Direct3D y D3DX . La ventaja sobre los números enteros de 8 o 16 bits es que el rango dinámico aumentado permite conservar más detalles en las luces y sombras de las imágenes y evita la corrección gamma. La ventaja sobre el punto flotante de precisión simple de 32 bits es que requiere la mitad del almacenamiento y el ancho de banda (a expensas de la precisión y el rango). [5]
La precisión media puede ser útil para la cuantificación de mallas . Los datos de mallas se almacenan normalmente utilizando números flotantes de precisión simple de 32 bits para los vértices, sin embargo, en algunas situaciones es aceptable reducir la precisión a solo 16 bits de precisión media, lo que requiere solo la mitad del almacenamiento a expensas de cierta precisión. La cuantificación de mallas también se puede realizar con precisión fija de 8 o 16 bits según los requisitos. [12]
El hardware y el software para el aprendizaje automático o las redes neuronales tienden a utilizar precisión media: estas aplicaciones suelen realizar una gran cantidad de cálculos, pero no requieren un alto nivel de precisión. Debido a que el hardware normalmente no admite números flotantes de precisión media de 16 bits, las redes neuronales suelen utilizar el formato bfloat16 , que es el formato flotante de precisión simple truncado a 16 bits.
Si el hardware tiene instrucciones para realizar cálculos matemáticos de precisión media, suele ser más rápido que con precisión simple o doble. Si el sistema tiene instrucciones SIMD que pueden manejar múltiples números de punto flotante dentro de una instrucción, la precisión media puede ser el doble de rápida al operar con el doble de números simultáneamente. [13]
Zig proporciona soporte para medias precisiones con su f16
tipo. [14]
.NET 5 introdujo números de punto flotante de media precisión con el System.Half
tipo de biblioteca estándar. [15] [16] A partir de enero de 2024, ningún lenguaje .NET ( C# , F# , Visual Basic y C++/CLI y C++/CX ) tiene literales (por ejemplo, en C#, 1.0f
tiene tipo System.Single
o 1.0m
tiene tipo System.Decimal
) o una palabra clave para el tipo. [17] [18] [19]
Swift introdujo números de punto flotante de media precisión en Swift 5.3 con el tipo Float16. [20]
OpenCL también admite números de punto flotante de media precisión con el tipo de datos half en el formato de almacenamiento de media precisión IEEE 754-2008. [21]
A partir de 2024, Rust está trabajando en agregar un nuevo f16
tipo para flotantes IEEE de 16 bits de media precisión. [22]
Julia proporciona soporte para números de punto flotante de precisión media con el Float16
tipo. [23]
Varias versiones de la arquitectura ARM tienen soporte para precisión media. [24]
La compatibilidad con precisión media en el conjunto de instrucciones x86 se especifica en la extensión del conjunto de instrucciones F16C , introducida por primera vez en 2009 por AMD y adoptada de forma bastante amplia por las CPU AMD e Intel en 2012. Esto se amplió aún más con la extensión del conjunto de instrucciones AVX-512_FP16 implementada en el procesador Intel Sapphire Rapids . [25]
En RISC-V , las extensionesZfh
y proporcionan soporte de hardware para números de punto flotante de precisión media de 16 bits. La extensión es una alternativa mínima a . [26]Zfhmin
Zfhmin
Zfh
En Power ISA , VSX y la extensión SVP64 aún no aprobada brindan soporte de hardware para flotantes de media precisión de 16 bits a partir de PowerISA v3.1B y posteriores. [27] [28]
Nvidia introdujo recientemente soporte nativo de punto flotante de media precisión (FP16) en sus GPU Pascal. Esto estuvo motivado principalmente por la posibilidad de que esto acelere las aplicaciones con uso intensivo de datos y tolerantes a errores en las GPU.