ARM Cortex-M4 VFMA (Fused Multiply-Add) Leistung? 3, 2 oder 1 Uhr? Weiterleitung?

Ich arbeite an leistungskritischem DSP-Code, der auf einem ARM Cortex-M4 ausgeführt werden soll. Ein bestimmter Abschnitt des Codes (eine Sinc-Interpolationsfunktion) ist voll von Multiplikations-Akkumulation-Operationen, und ich versuche sicherzustellen, dass die Leistung so gut wie möglich ist, damit wir die MCU langsamer takten und Strom sparen können.

Jetzt habe ich den von arm-none-gcc-eabi ausgegebenen Code für meine Interpolationsfunktion untersucht und er war nicht leistungsfähig genug, also habe ich die innere Schleife in Assembly entrollt und neu geschrieben, um eine Reihe von VFMA-verschmolzenen Multiplizier-Add-Anweisungen wie zu verwenden So:

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

Zu meiner Überraschung sagt das Cortex-M4 Technical Reference Manual jedoch etwas Seltsames über die Leistung des VFMA-Befehls. Während ordnungsgemäß geplante VADD- und VMUL-Operationen jeweils einen einzelnen Taktzyklus benötigen, sagt das CM4-TRM, dass VFMA drei Taktzyklen benötigt! Auf dieser Grundlage würde man schlussfolgern, dass die schnellste entrollte Schleife aus verschachtelten VMUL- und VADD-Befehlen bestehen sollte und nicht aus halb so vielen VFMA-Befehlen.

Es gab einige Online-Diskussionen zu diesem Thema, aber die Informationen sind spärlich und widersprüchlich. Einige sagen, dass VFMA eher auf eine Reduzierung der Codegröße als auf eine Verbesserung der Geschwindigkeit abzielt und dass 3 Zyklen normal sind. Andere berichten, im Gegensatz zum CM4 TRM, eine Ausführungszeit von 2 Takten in einer langen ausgerollten Schleife zu beobachten. Eine Kopie des TRM besagt, dass, wenn mehrere VFMA-Operationen nacheinander ausgeführt werden, die Ergebnisse weitergeleitet werden und die Ausführungszeit nur 1 Taktzyklus beträgt. Einige sagen, dass viele der online veröffentlichten langsameren VFMA-Messungen unter einer zusätzlichen Verlangsamung aufgrund von Flash-Wartezuständen oder einer falschen Konfiguration der Prefetch-Engine der MCU leiden.

Kann jemand etwas Licht ins Dunkel bringen, welche Faktoren das Timing von VFMA auf dem Cortex-M4 beeinflussen?

Antworten (1)

Im TRM steht die Aussage:

Gleitkomma-Arithmetik-Datenverarbeitungsanweisungen wie Addieren, Subtrahieren, Multiplizieren, Dividieren, Quadratwurzel, alle Formen von Multiplizieren mit Akkumulieren sowie Konvertierungen aller Art benötigen einen Zyklus länger, wenn ihr Ergebnis von der folgenden Anweisung verbraucht wird.

Eine Sequenz von VMUL, VADDwird dieselbe Anzahl von Zyklen (3) benötigen wie eine isolierte, VFMAwenn sie Rücken an Rücken sind. Der Compiler kann die Umordnungsanweisungen nutzen , um diese Gefahr zu beseitigen. Daher VMUL, [..], VADDwird eine Folge von immer genauso gut oder besser abschneiden als die entsprechende VFMAAnweisung. Es ist auch zu beachten, dass die Codegröße mit VFMArelativ zu der VMUL, VADD.

Betreff. Bei den Messungen ist es aufgrund der Implementierung des Anbieters schwierig, die Artefakte zu trennen, wenn man bedenkt, dass der Cortex-M nur ein Teil eines (viel) größeren Systems sein wird. In den Tausenden von Dokumentationsseiten ist es sehr einfach, so etwas wie einen Flash-Wartezustand usw. zu übersehen.