¿Rendimiento ARM Cortex-M4 VFMA (multiplicación fusionada)? 3, 2 o 1 reloj? ¿Reenvío?

Estoy trabajando en un código DSP de rendimiento crítico destinado a ejecutarse en un ARM Cortex-M4. Una sección particular del código (una función de interpolación sinc) es densa con operaciones de acumulación múltiple y estoy tratando de asegurar que el rendimiento sea lo mejor posible para que podamos cronometrar la MCU más lentamente y ahorrar energía.

Ahora, inspeccioné el código emitido por arm-none-gcc-eabi para mi función de interpolación y no tenía el rendimiento suficiente, por lo que desenrollé y reescribí el ciclo interno en ensamblador para usar una cadena de instrucciones VFMA fusionadas con multiplicación y suma como entonces:

VFMA.F32  S8, S24, S16
VFMA.F32  S8, S25, S17
VFMA.F32  S8, S26, S18
VFMA.F32  S8, S27, S19
VFMA.F32  S8, S28, S20
VFMA.F32  S8, S29, S21
VFMA.F32  S8, S30, S22
VFMA.F32  S8, S31, S23

Sin embargo, para mi sorpresa, el Manual de referencia técnica de Cortex-M4 dice algo extraño sobre el rendimiento de la instrucción VFMA. Si bien las operaciones VADD y VMUL programadas correctamente toman cada una un solo ciclo de reloj, el CM4 TRM dice que VFMA toma tres ciclos de reloj. Sobre esa base, uno concluiría que el bucle desenrollado más rápido debería consistir en instrucciones VMUL y VADD intercaladas, en lugar de la mitad de instrucciones VFMA.

Ha habido cierta discusión en línea sobre este tema, pero la información es escasa e inconsistente. Algunos dicen que VFMA tiene como objetivo la reducción del tamaño del código en lugar de la mejora de la velocidad y que 3 ciclos es lo normal. Otros informan observar un tiempo de ejecución de 2 relojes en un ciclo largo desenrollado, contrario al CM4 TRM. Una copia del TRM dice que cuando se ejecutan secuencialmente múltiples operaciones VFMA, los resultados se envían y el tiempo de ejecución es solo 1 ciclo de reloj. Algunos dicen que muchas de las mediciones de VFMA más lentas publicadas en línea sufren una ralentización adicional debido a estados de espera instantáneos o a una configuración incorrecta del motor de captación previa de la MCU.

¿Alguien puede arrojar algo de luz sobre qué factores influyen en el tiempo de VFMA en el Cortex-M4?

Respuestas (1)

En el TRM, se encuentra la declaración:

Las instrucciones de procesamiento de datos aritméticos de punto flotante, como sumar, restar, multiplicar, dividir, raíz cuadrada, todas las formas de multiplicar con acumular, así como las conversiones de todo tipo, tardan un ciclo más si su resultado es consumido por la siguiente instrucción.

Una secuencia de VMUL, VADDtomará el mismo número de ciclos (3) que un aislado VFMAsi están espalda con espalda. El compilador puede aprovechar las instrucciones de reordenación para eliminar este riesgo. Por lo tanto, una secuencia de VMUL, [..], VADDsiempre funcionará tan bien o mejor que la VFMAinstrucción equivalente. También vale la pena tener en cuenta que el tamaño del código VFMAse reducirá en relación con el VMUL, VADD.

Re. las medidas, es difícil separar los artefactos debido a la implementación del proveedor, recordando que el Cortex-M solo será parte de un sistema (mucho) más grande. En los miles de páginas de documentación, es muy fácil pasar por alto algo como un estado de espera flash, etc.