En computación , especialmente en el procesamiento de señales digitales , la operación de multiplicar-acumular es un paso común que calcula el producto de dos números y agrega ese producto a un acumulador . La unidad de hardware que realiza la operación se conoce como multiplicador-acumulador ( MAC o unidad MAC ); la operación en sí también a menudo se denomina MAC o operación MAC. La operación MAC modifica un acumulador a :
Cuando se hace con números de coma flotante , se puede realizar con dos redondeos (típico en muchos DSP ) o con un solo redondeo. Cuando se realiza con un solo redondeo, se denomina multiplicación-suma fusionada ( FMA ) o multiplicación-acumulación fusionada ( FMAC ).
Las computadoras modernas pueden contener un MAC dedicado, que consiste en un multiplicador implementado en lógica combinacional seguido de un sumador y un registro acumulador que almacena el resultado. La salida del registro se retroalimenta a una entrada del sumador, de modo que en cada ciclo de reloj, la salida del multiplicador se agrega al registro. Los multiplicadores combinacionales requieren una gran cantidad de lógica, pero pueden calcular un producto mucho más rápidamente que el método de cambio y adición típico de las computadoras anteriores. Percy Ludgate fue el primero en concebir un MAC en su Máquina analítica de 1909, [1] y el primero en explotar un MAC para la división (utilizando la multiplicación sembrada por recíproco, a través de la serie convergente (1+ x ) -1 ). Los primeros procesadores modernos equipados con unidades MAC fueron los procesadores de señales digitales , pero la técnica ahora también es común en los procesadores de propósito general. [2] [3] [4]
En aritmética de coma flotante
Cuando se hace con números enteros , la operación es típicamente exacta ( módulo calculado una potencia de dos ). Sin embargo, los números de coma flotante tienen solo una cierta cantidad de precisión matemática . Es decir, la aritmética de coma flotante digital generalmente no es asociativa ni distributiva . (Ver punto flotante § Problemas de precisión ). Por lo tanto, el resultado es una diferencia si la multiplicación-suma se realiza con dos redondeos o en una operación con un solo redondeo (una combinación de multiplicación-suma). IEEE 754-2008 especifica que debe realizarse con un redondeo, lo que arroja un resultado más preciso. [5]
Fusionar multiplicar - agregar
Una operación de multiplicación-suma fusionada ( FMA o fmadd ) [6] es una operación de multiplicación-suma de punto flotante que se realiza en un solo paso, con un solo redondeo. Es decir, donde una multiplicación-suma no fusionada calcularía el producto b × c , lo redondearía a N bits significativos, sumaría el resultado a a , y volvería a redondear a N bits significativos, una multiplicación-suma fusionada calcularía la expresión completa a + ( b × c ) hasta su máxima precisión antes de redondear el resultado final a N bits significativos.
Una FMA rápida puede acelerar y mejorar la precisión de muchos cálculos que implican la acumulación de productos:
- Producto escalar
- Multiplicación de matrices
- Evaluación polinomial (p. Ej., Con la regla de Horner )
- Método de Newton para evaluar funciones (de la función inversa)
- Convoluciones y redes neuronales artificiales
- Multiplicación en aritmética doble-doble
Por lo general, se puede confiar en la combinación de multiplicar-agregar para obtener resultados más precisos. Sin embargo, William Kahan ha señalado que puede dar problemas si se usa sin pensar. [7] Si x 2 - y 2 se evalúa como (( x × x ) - y × y ) (siguiendo la notación sugerida por Kahan en la que los paréntesis redundantes dirigen al compilador a redondear el término ( x × x ) primero) usando multiplicación fusionada - suma, entonces el resultado puede ser negativo incluso cuando x = y debido a que la primera multiplicación descarta bits de baja significancia. Esto podría dar lugar a un error si, por ejemplo, se evalúa la raíz cuadrada del resultado.
Cuando se implementa dentro de un microprocesador , un FMA puede ser más rápido que una operación de multiplicación seguida de una suma. Sin embargo, las implementaciones industriales estándar basadas en el diseño original de IBM RS / 6000 requieren un sumador de 2 N bits para calcular la suma correctamente. [8]
Otro beneficio de incluir esta instrucción es que permite una implementación de software eficiente de las operaciones de división (ver algoritmo de división ) y raíz cuadrada (ver métodos de cálculo de raíces cuadradas ), eliminando así la necesidad de hardware dedicado para esas operaciones. [9]
Instrucción del producto escalar
Algunas máquinas combinan múltiples fusionado multiplican añadir operaciones en un solo paso, por ejemplo, la realización de una de cuatro elementos dot-producto en dos 128 bits SIMD registros a0×b0 + a1×b1 + a2×b2 + a3×b3
con el rendimiento de un solo ciclo.
Apoyo
La operación FMA está incluida en IEEE 754-2008 .
El Digital Equipment Corporation (DEC) VAX 's POLY
instrucción se utiliza para evaluar polinomios con la regla de Horner utilizando una sucesión de multiplicar y añadir pasos. Las descripciones de las instrucciones no especifican si la multiplicación y la suma se realizan utilizando un solo paso FMA. [10] Esta instrucción ha sido parte del conjunto de instrucciones VAX desde su implementación original 11/780 en 1977.
El estándar de 1999 del lenguaje de programación C admite la operación FMA a través de la fma()
función de biblioteca matemática estándar y pragmas estándar ( #pragma STDC FP_CONTRACT
) que controlan optimizaciones basadas en FMA.
La operación fusionada multiplicar-añadir se introdujo como "multiplicar-añadir fusionada" en el procesador IBM POWER1 (1990), [11] pero se ha agregado a muchos otros procesadores desde entonces:
- HP PA-8000 (1996) y superior
- Hitachi SuperH SH-4 (1998)
- SCE - Toshiba Emotion Engine (1999)
- Intel Itanium (2001)
- Célula de ITS (2006)
- Fujitsu SPARC64 VI (2007) y superior
- ( Compatible con MIPS ) Loongson -2F (2008) [12]
- Elbrus-8SV (2018)
- Procesadores x86 con conjunto de instrucciones FMA3 y / o FMA4
- Bulldozer AMD (2011, solo FMA4)
- AMD Piledriver (2012, FMA3 y FMA4) [13]
- Apisonadora AMD (2014)
- Excavadora AMD (2015)
- AMD Zen (2017, solo FMA3)
- Intel Haswell (2013, solo FMA3) [14]
- Intel Skylake (2015, solo FMA3)
- Procesadores ARM con VFPv4 y / o NEONv2:
- BRAZO Cortex-M4F (2010)
- ARM Cortex-A5 (2012)
- ARM Cortex-A7 (2013)
- ARM Cortex-A15 (2012)
- Qualcomm Krait (2012)
- Manzana A6 (2012)
- Todos los procesadores ARMv8
- Fujitsu A64FX tiene "FMA de cuatro operandos con instrucción de prefijo".
- IBM z / Architecture (desde 1998)
- Tarjetas GPU y GPGPU:
- GPU de microdispositivos avanzados (2009) y posteriores
- TeraScale 2 basada en la serie "Evergreen"
- Graphics Core basado en Next
- GPU NVidia (2010) y posteriores
- Basado en Fermi (2010)
- Basado en Kepler (2012)
- Basado en Maxwell (2014)
- Basada en Pascal (2016)
- Basado en Volta (2017)
- GPU Intel desde Sandy Bridge
- Intel MIC (2012)
- ARM Mali T600 Series (2012) y superior
- GPU de microdispositivos avanzados (2009) y posteriores
- Procesadores vectoriales:
- NEC SX-Aurora TSUBASA
Referencias
- ^ "La viabilidad de la máquina analítica de Ludgate" . Archivado desde el original el 7 de agosto de 2019 . Consultado el 30 de agosto de 2020 .
- ^ Lyakhov, Pavel; Valueva, Maria; Valuev, Georgii; Nagornov, Nikolai (enero de 2020). "Un método para aumentar el rendimiento del filtro digital basado en unidades de acumulación y multiplicación truncadas" . Ciencias Aplicadas . 10 (24): 9052. doi : 10.3390 / app10249052 .
- ^ Tung Thanh Hoang; Sjalander, M .; Larsson-Edefors, P. (mayo de 2009). "Unidad de acumulación y multiplicación de doble rendimiento para mejoras del procesador FlexCore" . Simposio internacional de IEEE sobre procesamiento distribuido paralelo de 2009 : 1–7. doi : 10.1109 / IPDPS.2009.5161212 . ISBN 978-1-4244-3751-1.
- ^ Kang, Jongsung; Kim, Taewhan (1 de marzo de 2020). "PV-MAC: estructura de la unidad de multiplicar y acumular explotando la variabilidad de precisión en redes neuronales convolucionales en el dispositivo" . Integración . 71 : 76–85. doi : 10.1016 / j.vlsi.2019.11.003 . ISSN 0167-9260 .
- ^ Whitehead, Nathan; Fit-Florea, Alex (2011). "Precisión y rendimiento: punto flotante y cumplimiento de IEEE 754 para GPU NVIDIA" (PDF) . nvidia . Consultado el 31 de agosto de 2013 .
- ^ "fmadd instrs" .
- ^ Kahan, William (31 de mayo de 1996). "Estándar IEEE 754 para aritmética de coma flotante binaria" .
- ^ Quinnell, Eric (mayo de 2007). Arquitecturas de punto flotante fusionadas y multiplicar-añadir (PDF) (tesis doctoral) . Consultado el 28 de marzo de 2011 .
- ^ Markstein, Peter (noviembre de 2004). División de software y raíz cuadrada con algoritmos de Goldschmidt (PDF) . VI Jornada sobre Números Reales y Computadoras. CiteSeerX 10.1.1.85.9648 .
- ^ "Instrucción VAX de la semana: POLY" . Archivado desde el original el 13 de febrero de 2020.
- ^ Montoye, RK; Hokenek, E .; Runyon, SL (enero de 1990). "Diseño de la unidad de ejecución de punto flotante IBM RISC System / 6000". Revista de investigación y desarrollo de IBM . 34 (1): 59–70. doi : 10.1147 / rd.341.0059 .
- ^ "Godson-3 emula x86: nuevo procesador chino compatible con MIPS tiene extensiones para traducción x86" .
- ^ Hollingsworth, Brent (octubre de 2012). Instrucciones "Nuevo" Bulldozer "y" Piledriver " . Central de desarrolladores de AMD.
- ^ "Intel agrega 22nm octo-core 'Haswell' a la hoja de ruta de diseño de CPU" . El registro . Archivado desde el original el 27 de marzo de 2012 . Consultado el 19 de agosto de 2008 .