En informática , especialmente en el procesamiento de señales digitales , la operación multiplicar-acumular ( MAC ) o multiplicar-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 a :
Cuando se realiza 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 una MAC dedicada, que consta de 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 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 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 (usando 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 ahora la técnica también es común en los procesadores de uso general. [2] [3] [4] [5]
Cuando se realiza con números enteros , la operación suele ser exacta (se calcula en módulo de alguna potencia de dos ). Sin embargo, los números de coma flotante sólo tienen una cierta precisión matemática . Es decir, la aritmética digital de coma flotante generalmente no es asociativa ni distributiva . (Ver 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]
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 solo redondeo. Es decir, donde una 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 redondearía a N bits significativos, una multiplicación y 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.
Un FMA rápido puede acelerar y mejorar la precisión de muchos cálculos que implican la acumulación de productos:
Por lo general, se puede confiar en la combinación de multiplicación y suma para obtener resultados más precisos. Sin embargo, William Kahan ha señalado que puede dar problemas si se utiliza sin pensar. [8] 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 indican al compilador que redondee el término ( x × x ) primero) usando multiplicación fusionada: sumar, 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 luego 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. [9]
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. [10]
Algunas máquinas combinan múltiples operaciones de suma múltiple fusionadas en un solo paso, por ejemplo, realizando un producto punto de cuatro elementos en dos registros SIMDa0×b0 + a1×b1 + a2×b2 + a3×b3
de 128 bits con rendimiento de ciclo único.
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 utilizando 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 solo paso de 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 soporta 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 suma (contracción de expresiones de punto flotante), que puede habilitarse o deshabilitarse explícitamente con pragmas estándar ( #pragma STDC FP_CONTRACT
) . Los compiladores GCC y Clang C realizan este tipo de transformaciones de forma predeterminada para arquitecturas de procesador que admiten instrucciones FMA. Con GCC, que no admite el pragma antes mencionado, [12] esto se puede controlar globalmente mediante la -ffp-contract
opción de línea de comando. [13]
La operación fusionada de multiplicar y sumar se introdujo como "multiplicar y sumar fusionada" en el procesador IBM POWER1 (1990), [14] pero se ha agregado a muchos otros procesadores desde entonces: