Articulo de referencia

Operación de multiplicación y acumulación

En informática , especialmente en el procesamiento de señales digitales , la operación de multiplicación-acumulación ( MAC ) o multiplicación-suma ( MAD ) es un paso común que c...

En informática , especialmente en el procesamiento de señales digitales , la operación de multiplicación-acumulación ( MAC ) o multiplicación-suma ( MAD ) es un paso común que calcula el producto de dos números y lo suma a un acumulador . La unidad de hardware que realiza la operación se conoce como multiplicador-acumulador ( unidad MAC ); la operación en sí también se denomina a menudo operación MAC o MAD. La operación MAC modifica un acumulador :aa+(b×do){\displaystyle a\gets a+(b\times c)}

Cuando se trabaja con números de coma flotante , puede realizarse con dos redondeos (lo habitual 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 ).

Los ordenadores modernos pueden contener una MAC dedicada, 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 realimenta a una entrada del sumador, de modo que en cada ciclo de reloj, la salida del multiplicador se suma 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 desplazamiento y suma típico de los ordenadores anteriores. Percy Ludgate fue el primero en concebir una MAC en su Máquina Analítica de 1909, [ 1 ] y el primero en utilizar una MAC para la división (usando la multiplicación iniciada por el 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 ] [ 5 ]

En aritmética de punto flotante

Cuando se realiza con números enteros , la operación suele ser exacta (calculada módulo alguna potencia de dos ). Sin embargo, los números de coma flotante solo tienen una cierta precisión matemática . Es decir, la aritmética digital de coma flotante generalmente no es asociativa ni distributiva . (Véase Aritmética de coma flotante §  Problemas de precisión ). Por lo tanto, el resultado varía según si la multiplicación-suma se realiza con dos redondeos o en una sola operación con un único redondeo (una multiplicación-suma fusionada). La norma IEEE 754-2008 especifica que debe realizarse con un solo redondeo, lo que produce un resultado más preciso. [ 6 ]

Multiplicación-suma fusionada

Una operación de multiplicación y suma fusionada ( FMA o fmadd ) [ 7 ] es una operación de multiplicación y suma de punto flotante realizada en un solo paso ( operación fusionada ), con un único redondeo. Es decir, mientras que una operación de multiplicación y suma no fusionada calcularía el producto b × c , lo redondearía a N bits significativos, sumaría el resultado a a y lo redondearía de nuevo a N bits significativos, una operación de multiplicación y suma fusionada calcularía la expresión completa a + ( b × c ) con toda su precisión antes de redondear el resultado final a N bits significativos.

Un FMA rápido puede acelerar y mejorar la precisión de muchos cálculos que implican la acumulación de productos:

La multiplicación-suma fusionada suele proporcionar resultados más precisos. Sin embargo, William Kahan ha señalado que puede generar problemas si se utiliza sin criterio. [ 8 ] Si x 2y 2 se evalúa como (( x × x ) − y × y ) (siguiendo la notación sugerida por Kahan, en la que los paréntesis redundantes indican al compilador que redondee primero el término ( x × x ) ) utilizando la multiplicación-suma fusionada, el resultado puede ser negativo incluso cuando x = y, debido a que la primera multiplicación descarta los bits de baja significancia. Esto podría provocar un error si, por ejemplo, se evalúa la raíz cuadrada del resultado.

Cuando se implementa dentro de un microprocesador , una operación FMA puede ser más rápida que una multiplicación seguida de una suma. Sin embargo, las implementaciones industriales estándar basadas en el diseño original del IBM RS/6000 requieren un sumador de 2N bits para calcular la suma correctamente. [ 9 ]

Otro beneficio de incluir esta instrucción es que permite una implementación de software eficiente de las operaciones de división (véase el algoritmo de división ) y raíz cuadrada (véase los métodos para calcular raíces cuadradas ), eliminando así la necesidad de hardware dedicado para dichas operaciones. [ 10 ]

Instrucciones de producto escalar

Algunas máquinas combinan varias operaciones de multiplicación y suma fusionadas en un solo paso, por ejemplo, realizando un producto escalar de cuatro elementos en dos registros SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3 de 128 bits con un rendimiento de un solo ciclo.

Apoyo

La operación FMA está incluida en la norma IEEE 754-2008 .

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 la biblioteca matemática estándar y la transformación automática de una multiplicación seguida de una suma (contracción de expresiones de punto flotante), que se puede habilitar o deshabilitar explícitamente con pragmas estándar ( #pragma STDC FP_CONTRACT). Los compiladores C GCC y Clang realizan dichas transformaciones por defecto para arquitecturas de procesador que admiten instrucciones FMA. Con GCC, que no admite el pragma mencionado anteriormente, [ 11 ] esto se puede controlar globalmente mediante la -ffp-contractopción de línea de comandos. [ 12 ]

La operación de multiplicación-suma fusionada se introdujo como "multiplicación-suma fusionada" en el procesador IBM POWER1 (1990), [ 13 ] pero se ha añadido a numerosos procesadores:

Tarjetas gráficas y tarjetas GPGPU:

Variantes con dos o más redondeos

Truncamiento de MAD

Una implementación más sencilla de MADD implica truncar el resultado de la multiplicación antes de la suma. Esto no ofrece ninguna ventaja en cuanto a precisión (de hecho, es menos preciso), pero antes de 2010 era más común en las GPU que la precisa FMA. Un ejemplo se puede ver en la instrucción "FMAD" de Nvidia PTX. [ 18 ]

La opción de optimización de OpenCL -cl-mad-enablepermite reemplazar a * b + ccon mad(a, b, c), la función que calcula la expresión equivalente "con precisión reducida" en OpenCL 1.0. [ 19 ] La precisión de esta opción, así como de , mad()se ha vuelto más matizada en versiones más recientes de OpenCL, permitiendo solo precisión reducida en el "perfil integrado" a partir de la versión 3.0. [ 20 ]

Redondeo con precisión intermedia adicional

La instrucción VAX de Digital Equipment Corporation (DEC) se utiliza para evaluar polinomios con la regla de Horner mediante una sucesión de pasos de multiplicación y suma. Las descripciones de la instrucción no especifican si la multiplicación y la suma se realizan mediante un único paso FMA. Esta instrucción ha formado parte del conjunto de instrucciones VAX desde su implementación original en el 11/780 en 1977. [ 21 ] Según Bob Supnik, la máquina realiza internamente la multiplicación y la suma con precisión extendida y luego las convierte al formato de destino. [ 22 ] Por lo tanto, hay un paso de redondeo después de la multiplicación. Como resultado, aunque esta operación es más precisa que una operación ingenua en el formato de destino, no cumple con la definición de FMA del IEEE.POLYa * b + c

Este comportamiento también es comparable al uso FLT_EVAL_METHOD == 2en x87 .

Véase también

Referencias

  1. "La viabilidad de la máquina analítica de Ludgate" . Archivado del original el 7 de agosto de 2019. Consultado el 30 de agosto de 2020 .
  2. Lyakhov, Pavel; Valueva, Maria; Valuev, Georgii; Nagornov, Nikolai (enero de 2020). "Un método para aumentar el rendimiento de los filtros digitales basado en unidades de multiplicación y acumulación truncadas" . Ciencias Aplicadas . 10 (24): 9052. doi : 10.3390/app10249052 .
  3. Tung Thanh Hoang; Sjalander, M.; Larsson-Edefors, P. (mayo de 2009). «Unidad de multiplicación y acumulación de doble rendimiento para mejoras del procesador FlexCore». Simposio Internacional IEEE de Procesamiento Paralelo y Distribuido de 2009. págs. 1-7 . doi : 10.1109/IPDPS.2009.5161212 . ISBN  978-1-4244-3751-1. S2CID 14535090 . 
  4. Kang, Jongsung; Kim, Taewhan (2020-03-01). "PV-MAC: Estructura de unidad de multiplicación y acumulación que explota la variabilidad de precisión en redes neuronales convolucionales en dispositivos" . Integration . 71 : 76–85 . doi : 10.1016/j.vlsi.2019.11.003 . ISSN 0167-9260 . S2CID 211264132 .  
  5. "mad - ps" . 20 de noviembre de 2019. Consultado el 14 de agosto de 2021 .
  6. Whitehead, Nathan; Fit-Florea, Alex (2011). "Precisión y rendimiento: punto flotante y cumplimiento de IEEE 754 para GPU de NVIDIA" (PDF) . nvidia . Recuperado el 31 de agosto de 2013 .
  7. "fmadd instrs" . IBM .
  8. Kahan, William (1996-05-31). "Estándar IEEE 754 para aritmética de punto flotante binario" .
  9. Quinnell, Eric (mayo de 2007). Arquitecturas de multiplicación y suma fusionadas de punto flotante (PDF) (tesis doctoral) . Recuperado el 28 de marzo de 2011 .
  10. Markstein, Peter (noviembre de 2004). División de software y raíz cuadrada usando algoritmos de Goldschmidt (PDF) . 6.ª Conferencia sobre números reales y computadoras. CiteSeerX 10.1.1.85.9648 . 
  11. "Bug 20785 - Pragma STDC * (C99 FP) no implementado" . gcc.gnu.org . Consultado el 2 de febrero de 2022 .
  12. "Optimizar opciones (usando la colección de compiladores GNU (GCC))" . gcc.gnu.org . Consultado el 2 de febrero de 2022 .
  13. Montoye, RK; Hokenek, E.; Runyon, SL (enero de 1990). "Diseño de la unidad de ejecución de punto flotante del sistema RISC/6000 de IBM". IBM Journal of Research and Development . 34 (1): 59– 70. doi : 10.1147/rd.341.0059 .Icono de acceso cerrado
  14. "Godson-3 emula x86: Nuevo procesador chino compatible con MIPS tiene extensiones para la traducción de x86" .
  15. "Manual de programación de microcontroladores STM32 Cortex-M33" (PDF) . ST . Consultado el 6 de mayo de 2024 .
  16. Hollingsworth, Brent (octubre de 2012). "Nuevas instrucciones para "Bulldozer" y "Piledriver" . AMD Developer Central.
  17. "Intel añade el procesador de ocho núcleos 'Haswell' de 22 nm a su hoja de ruta de diseño de CPU" . The Register . Archivado del original el 17 de febrero de 2012. Consultado el 19 de agosto de 2008 .
  18. Nvidia (14 de febrero de 2011). "Guía de mejores prácticas de OpenCL" (PDF) . developer.download.nvidia.com . Consultado el 27 de septiembre de 2025 .
  19. "Especificación OpenCL Versión: 1.0 Revisión del documento: 43" (PDF) .
  20. "Especificación OpenCL™ Versión 3.0.19 (5.8.6.3. Opciones de optimización)" . registry.khronos.org .
  21. "Instrucción VAX de la semana: POLY" . Archivado del original el 13 de febrero de 2020.
  22. Bob Supnik. "Cómo VAX perdió su POLY" (PDF) .