stringtranslate.com

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 calcula el producto de dos números y suma ese producto 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 suele denominarse operación MAC o MAD. La operación MAC modifica un acumulador :

Cuando se trabaja con números de punto flotante , se puede realizar con dos redondeos (algo 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 ).

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ápido que el método de desplazamiento 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 procesadores de señales digitales , pero la técnica ahora también es común en 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 es típicamente exacta (calculada módulo alguna potencia de dos ). Sin embargo, los números de punto flotante tienen solo una cierta cantidad de precisión matemática . Es decir, la aritmética digital de punto flotante generalmente no es asociativa ni distributiva . (Véase Aritmética de punto flotante § Problemas de precisión ). Por lo tanto, hay una diferencia en el resultado si la multiplicación-suma se realiza con dos redondeos o en una operación con un solo redondeo (una multiplicación-suma fusionada). IEEE 754-2008 especifica que debe realizarse con un redondeo, lo que produce un resultado más preciso. [6]

Multiplicación-suma fusionada

Una multiplicación-suma fusionada ( FMA o fmadd ) [7] es una operación de multiplicación-suma de punto flotante realizada en un solo paso ( operación fusionada ), 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 y redondearía de nuevo a N bits significativos, una multiplicación-suma fusionada calcularía toda la expresión a + ( b × c ) a su precisión completa antes de redondear el resultado final a la baja 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:

Generalmente, se puede confiar en que la multiplicación-suma fusionada dará resultados más precisos. Sin embargo, William Kahan ha señalado que puede dar problemas si se usa sin pensar. [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, entonces 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 conducir a un error si, por ejemplo, luego se evalúa la raíz cuadrada del resultado.

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

Otro beneficio de incluir esta instrucción es que permite una implementación de software eficiente de 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. [10]

Instrucciones del producto escalar

Algunas máquinas combinan múltiples 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 ciclo único.

Apoyo

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

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 las instrucciones no especifican si la multiplicación y la suma se realizan utilizando un único paso FMA. [11] Esta instrucción ha sido parte del conjunto de instrucciones VAX desde su implementación original 11/780 en 1977.POLY

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 la transformación automática de una multiplicación seguida de una adición (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 de forma predeterminada para las arquitecturas de procesador que admiten instrucciones FMA. Con GCC, que no admite el pragma mencionado anteriormente, [12] esto se puede controlar globalmente mediante la -ffp-contractopción de línea de comandos. [13]

La operación de multiplicación-suma fusionada se introdujo como "multiplicación-suma fusionada" en el procesador IBM POWER1 (1990), [14] pero se ha agregado a muchos otros procesadores desde entonces:

Véase también

Referencias

  1. ^ "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 .
  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-acumulación truncadas". Applied Sciences . 10 (24): 9052. doi : 10.3390/app10249052 .
  3. ^ 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 IEEE de 2009 sobre procesamiento paralelo y distribuido . págs. 1–7. doi :10.1109/IPDPS.2009.5161212. ISBN 978-1-4244-3751-1.S2CID14535090  .​
  4. ^ Kang, Jongsung; Kim, Taewhan (1 de marzo de 2020). "PV-MAC: Estructura de unidad de multiplicación y acumulación que explota 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. 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 NVIDIA" (PDF) . nvidia . Consultado el 31 de agosto de 2013 .
  7. ^ "instrucciones fmadd". IBM .
  8. ^ Kahan, William (31 de mayo de 1996). "Estándar IEEE 754 para aritmética binaria de punto flotante".
  9. ^ Quinnell, Eric (mayo de 2007). Arquitecturas de multiplicación y adición fusionadas de punto flotante (PDF) (tesis doctoral) . Consultado el 28 de marzo de 2011 .
  10. ^ Markstein, Peter (noviembre de 2004). División de software y raíz cuadrada utilizando algoritmos de Goldschmidt (PDF) . 6.ª Conferencia sobre números reales y computadoras. CiteSeerX 10.1.1.85.9648 . 
  11. ^ "Instrucción de la semana de VAX: POLY". Archivado desde el original el 13 de febrero de 2020.
  12. ^ "Error 20785 - Pragma STDC* (C99 FP) no implementado". gcc.gnu.org . Consultado el 2 de febrero de 2022 .
  13. ^ "Optimizar opciones (utilizando la colección de compiladores GNU (GCC))". gcc.gnu.org . Consultado el 2 de febrero de 2022 .
  14. ^ Montoye, RK; Hokenek, E.; Runyon, SL (enero de 1990). "Diseño de la unidad de ejecución de punto flotante IBM RISC System/6000". IBM Journal of Research and Development . 34 (1): 59–70. doi :10.1147/rd.341.0059.Icono de acceso cerrado
  15. ^ "Godson-3 emula x86: el nuevo procesador chino compatible con MIPS tiene extensiones para la traducción x86".
  16. ^ Hollingsworth, Brent (octubre de 2012). "Nuevas instrucciones para "Bulldozer" y "Piledriver"". AMD Developer Central.
  17. ^ "Intel añade el procesador octa-core 'Haswell' de 22 nm a la hoja de ruta de diseño de CPU". The Register . Archivado desde el original el 17 de febrero de 2012. Consultado el 19 de agosto de 2008 .
  18. ^ "Manual de programación de microcontroladores STM32 Cortex-M33" (PDF) . ST . Consultado el 6 de mayo de 2024 .