stringtranslate.com

Formato de punto flotante de media precisión

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]

Historia

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 a y desde flotantes de precisión simple con una instrucción de máquina.

Formato binario de punto flotante de media precisión IEEE 754: binary16

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 ).

Codificación de exponentes

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 verdadero exponente, 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.

Ejemplos de precisión media

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 .

Limitaciones de precisión

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.

ARM alternativa de media precisión

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.

Usos de la media precisión

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]

Soporte por lenguajes de programación

Zig proporciona soporte para medias precisiones con su f16tipo. [14]

.NET 5 introdujo números de punto flotante de media precisión con el System.Halftipo 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.0ftiene tipo System.Singleo 1.0mtiene 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 f16tipo para flotantes IEEE de 16 bits de media precisión. [22]

Julia proporciona soporte para números de punto flotante de media precisión con el Float16tipo. [23]

C++ introdujo la semiprecisión desde C++23 con el std::float16_ttipo. [24] GCC ya implementa soporte para ella. [25]

Soporte de hardware

Varias versiones de la arquitectura ARM tienen soporte para precisión media. [26]

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 . [27]

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 . [28]Zfhmin ZfhminZfh

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. [29] [30]

Véase también

Referencias

  1. ^ "Acerca de ABCI - Acerca de ABCI | ABCI". abci.ai . Consultado el 6 de octubre de 2019 .
  2. ^ "hitachi :: dataBooks :: HD61810 Digital Signal Processor Users Manual" (Manual del usuario del procesador de señal digital Hitachi :: DataBooks :: HD61810). Archive.org . Consultado el 14 de julio de 2017 .
  3. ^ Scott, Thomas J. (marzo de 1991). "Matemáticas e informática en conflicto sobre números reales". Actas del vigésimo segundo simposio técnico SIGCSE sobre educación en informática - SIGCSE '91 . Vol. 23. págs. 130-139. doi : 10.1145/107004.107029 . ISBN . 0897913779. Número de identificación del sujeto  16648394.
  4. ^ "/home/usr/bk/glide/docs2.3.1/GLIDEPGM.DOC". Gamers.org . Consultado el 14 de julio de 2017 .
  5. ^ ab "OpenEXR". OpenEXR. Archivado desde el original el 8 de mayo de 2013. Consultado el 14 de julio de 2017 .
  6. ^ Mark S. Peercy; Marc Olano; John Airey; P. Jeffrey Ungar. "Sombreado programable interactivo de múltiples pasadas" (PDF) . People.csail.mit.edu . Consultado el 14 de julio de 2017 .
  7. ^ "Patente US7518615 - Sistema de visualización con rasterización de punto flotante y punto flotante... - Google Patents". Google.com . Consultado el 14 de julio de 2017 .
  8. ^ "vs_2_sw". Documentación del kit de herramientas Cg 3.1 . Nvidia . Consultado el 17 de agosto de 2016 .
  9. ^ ab IEEE Standard for Floating-Point Arithmetic. IEEE STD 754-2019 (Revisión de IEEE 754-2008). Julio de 2019. págs. 1–84. doi :10.1109/ieeestd.2019.8766229. ISBN 978-1-5044-5924-2.
  10. ^ "Compatibilidad con números de punto flotante de precisión media". Guía del usuario del compilador de RealView Compilation Tools . 10 de diciembre de 2010. Consultado el 5 de mayo de 2015 .
  11. ^ Garrard, Andrew. "10.1. Números de punto flotante de 16 bits". Especificación de formato de datos de Khronos v1.2 rev 1 . Khronos . Consultado el 5 de agosto de 2023 .
  12. ^ "KHR_mesh_quantization". GitHub . Khronos Group . Consultado el 2 de julio de 2023 .
  13. ^ Ho, Nhut-Minh; Wong, Weng-Fai (1 de septiembre de 2017). "Explotación de aritmética de media precisión en GPU de Nvidia" (PDF) . Departamento de Ciencias de la Computación, Universidad Nacional de Singapur . Consultado el 13 de julio de 2020. 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.
  14. ^ "Flotas". ziglang.org . Consultado el 7 de enero de 2024 .
  15. ^ "Half Struct (System)" (Estructura media (sistema)). learn.microsoft.com . Consultado el 1 de febrero de 2024 .
  16. ^ Govindarajan, Prashanth (31 de agosto de 2020). "¡Presentamos el tipo Half!". Blog de .NET . Consultado el 1 de febrero de 2024 .
  17. ^ "Tipos numéricos de punto flotante: referencia de C#". learn.microsoft.com . 2022-09-29 . Consultado el 2024-02-01 .
  18. ^ "Literales: referencia del lenguaje F#". learn.microsoft.com . 2022-06-15 . Consultado el 2024-02-01 .
  19. ^ "Resumen de tipos de datos: referencia del lenguaje Visual Basic". learn.microsoft.com . 2021-09-15 . Consultado el 2024-02-01 .
  20. ^ "swift-evolution/proposals/0277-float16.md at main · apple/swift-evolution". github.com . Consultado el 13 de mayo de 2024 .
  21. ^ "extensión cl_khr_fp16". registration.khronos.org . Consultado el 31 de mayo de 2024 .
  22. ^ Cross, Travis. "Problema de seguimiento para los tipos de flotantes f16 y f128". GitHub . Consultado el 5 de julio de 2024 .
  23. ^ "Números enteros y de punto flotante · El lenguaje Julia". docs.julialang.org . Consultado el 11 de julio de 2024 .
  24. ^ "P1467R9: Tipos de punto flotante extendidos y nombres estándar". www.open-std.org . Consultado el 18 de octubre de 2024 .
  25. ^ "106652 – [C++23] P1467 - Tipos de punto flotante extendidos y nombres estándar". gcc.gnu.org . Consultado el 18 de octubre de 2024 .
  26. ^ "Formato de número de punto flotante de media precisión". Guía de referencia del compilador ARM armclang versión 6.7 . Desarrollador ARM . Consultado el 13 de mayo de 2022 .
  27. ^ Towner, Daniel. "Intel® Advanced Vector Extensions 512 - Conjunto de instrucciones FP16 para productos basados ​​en procesadores Intel® Xeon®" (PDF) . Programas para desarrolladores de Intel® . Consultado el 13 de mayo de 2022 .
  28. ^ "RISC-V Instruction Set Manual, Volume I: RISC-V User-Level ISA". Five EmbedDev . Consultado el 2 de julio de 2023 .
  29. ^ "OPF_PowerISA_v3.1B.pdf". Archivos OpenPOWER . Fundación OpenPOWER . Consultado el 2 de julio de 2023 .
  30. ^ "ls005.xlen.mdwn". libre-soc.org Git . Consultado el 2 de julio de 2023 .

Lectura adicional

Enlaces externos