Punto flotante: ¿Cómo funciona Fused Multiply-Add (FMA) y cuál es su importancia en la informática?

Para comprender esto, necesitará un poco de información sobre qué es una operación de multiplicación en hardware digital y qué es una operación de agregar en hardware digital. Un buen punto de partida es:

Multiplicador binario
Math Alive Crypto 1

Presta especial atención al método de multiplicación binaria. Implica formar productos parciales y luego sumarlos:

Una multiplicación no es más que sumar un montón de números. Si el tamaño de los números es N, entonces el resultado oscila entre N y 2N. Ahora en una secuencia de multiplicar y luego agregar, haríamos:

1. Cree la matriz de producto parcial que ve arriba
2. tome el resultado de esta serie de adiciones, vuelva a reducirlo a N bits; el resultado debe tener el mismo tamaño de bit que los 2 números multiplicados)
3. almacenar el resultado. También usamos el resultado para agregar.

Una fusión múltiple de suma omite los pasos 2 y 3. En su lugar, simplemente tomamos el número que se va a agregar y lo adjuntamos a las filas de arriba. Creamos un sumador gigante Carry-save de todo en lugar de sumar para multiplicar primero y luego agregar nuevamente.

Para la multiplicación de coma flotante, se necesitan algunos pasos más allá de la matriz parcial del producto. Debido al gran rango y la imprecisión que puede tener una multiplicación de punto flotante (ver Punto flotante), se deben detectar varios casos de redondeo y de número normal después de que se complete la operación.

En una computadora, si uno multiplicara un número de coma flotante y luego agregara un número de coma flotante al resultado, la especificación del punto flotante IEEE dice que el resultado de la multiplicación primero debe redondearse y verificarse para detectar denormal y / o excepciones ( resulta en infinito, por ejemplo) antes de realizar la adición.

Un agregado múltiple con fusible omite este paso y simplemente agrega la adición antes de que se realice cualquier verificación de redondeo o excepción. Esto ahorra un tiempo de circuito significativo.

Por ejemplo, en Krait (Snapdragon 800 y más allá), una suma múltiple fusionada de punto flotante de 64 bits toma un total de 6 ciclos. Una multiplicación de coma flotante de 64 bits toma 5 ciclos y una adición de coma flotante de 64 bits toma 3 ciclos.

Por lo tanto, usar una operación FMA tomaría 6 ciclos frente a 8.

Sin embargo, tenga en cuenta que debido a que omitimos el paso de redondeo y corrección denormal (normalización) después de la multiplicación, una operación FMA de punto flotante realmente dará un resultado * diferente * que una multiplicación de punto flotante + una adición de punto flotante. Sin embargo, si no le importan esas diferencias menores, un FMA es significativamente más rápido.

No puedo decir mucho sobre cómo se realiza en silicio. Aquí hay algunos pensamientos.

  • Una FMA a menudo toma aproximadamente el mismo número de ciclos que una suma o una multiplicación.
  • Una unidad de FMA canalizada a menudo puede realizar el FMA en un ciclo asintóticamente, por lo que obtiene 2 resultados por ciclo de reloj. Dado que un FMA es más simple que una unidad de suma y multiplicación completamente independiente, esta es una manera fácil de obtener el doble de rendimiento en sus especificaciones.
  • El FMA a menudo se realiza con mayor precisión (80 bits en x86), por lo que usarlo proporciona una mayor precisión que agregar y multiplicar por separado.
  • Un FMA claramente generaliza tanto la suma como la multiplicación, por lo que han existido arquitecturas que solo tenían unidades FMA. El nuevo Haswell de Intel es en realidad uno de esos.

La importancia de un FMA es que es una operación muy común: por ejemplo, un producto interno de vector es una serie de FMA, y por ese motivo, los productos matriz-vector y matriz-matriz consisten en FMA.

Eso es perder un paso.

La innovadora instrucción fue multiplicar, acumular y cambiar. Esa instrucción marcó el comienzo de la era de los procesadores de señales digitales (DSP). Los DSP se diseñaron en torno a esa instrucción porque esa es la ejecución central para calcular ecuaciones de diferencias finitas (FDE). Hacemos que los coeficientes sean negativos y aún utilizamos la suma, por lo general no hay un sabor de resta de la instrucción. La parte del turno no es un poco turno. Es un cambio de valores en una matriz: un historial de salidas recordadas.

FDE es cómo calcula computacionalmente los resultados de una transformación z (utiliza la transformación bilineal para convertir una transformación z en un FDE). La transformación Z es el análogo discreto del dominio continuo transformada de Laplace. La transformación de Laplace es cómo se opera en el dominio de la frecuencia en lugar del dominio del tiempo. Esa cadena de matemáticas es lo que hace posible la modulación de frecuencia digital, es decir, la comunicación digital.

El mundo moderno no es posible sin MAS.

El producto de puntos y la multiplicación de matrices son dos operaciones importantes aceleradas por FMA

La multiplicación de matrices se puede hacer como una serie de productos de puntos, así que centrémonos en el producto de puntos.

El producto de punto:

[matemáticas] (x, y, x) \ cdot (x2, y2, z3) [/ matemáticas]

es:

[matemáticas] (x \ veces x2) + (y \ veces y2) + (z \ veces z2) [/ matemáticas]

Entonces podemos escribir eso con FMA como:

doble resultado = 0.0;
resultado = fma (resultado, x, x2);
resultado = fma (resultado, y, y2);
resultado = fma (resultado, z, z2);

ahorrando así las 2 adiciones del método ingenuo.

La página wiki menciona algunas otras aplicaciones que se pueden acelerar la operación Multiplicar-acumular – Wikipedia:

  • evaluación polinómica con la regla de Horner
  • Método de Newton para la evaluación de funciones.
  • convoluciones para redes neuronales

FMA discreta

La versión discreta de FMA (con números enteros) es igualmente importante y ha existido durante mucho más tiempo, por ejemplo, la instrucción lea de x86, pero generalmente no está etiquetada como FMA.

La razón por la que esto es tan importante es para los cálculos de direcciones con matrices. Si quieres acceder:

  • el enésimo elemento
  • de una matriz en la que cada elemento tiene B bytes
  • y la dirección inicial de la matriz es A

la dirección final se calcula como:

[matemáticas] A + N * B [/ matemáticas]

Es solo una operación de Multiplicar-acumular que se realiza en un solo paso, por lo que solo hay un error de redondeo y la velocidad aumenta.

Conjunto de instrucciones de FMA