Wie viele Zyklen verwendet ein ARM Cortex M0, um Floats zu multiplizieren?

Auf einem ARM-Kortex m0+:

Wie viele Zyklen dauert es, um Floats mit einfacher Genauigkeit zu multiplizieren und in einem Float zu speichern? dh x = a*b; Wo x, a und b IEEE 754-Gleitkommazahlen mit einfacher Genauigkeit sind ... und was wäre, wenn sie beide doppelte Genauigkeit hätten?

Bonusfrage: Wie viele Zyklen dauert es, eine Ganzzahl um 16 Bit zu verschieben und in einer anderen Ganzzahl zu speichern. dh x = (y>>16); Wobei x und y 32-Bit-Ganzzahlen mit Vorzeichen sind.

BEARBEITEN:

Als Compiler verwende ich den ARM gcc Compiler

Der Grund, warum ich diese Frage stelle, ist, dass ich vorhabe, q31 zu verwenden, aber ich wollte sehen, was der Unterschied wirklich wäre

Der ARM Thumb2-Befehlssatz ist so effizient (Barrel Shifter erlaubt eine beliebige Anzahl von Verschiebungen in einem Zyklus gleichzeitig mit jedem anderen Befehl), dass es einen überraschend kleinen Unterschied zwischen Soft- und Hard-Float gibt, beispielsweise im Vergleich zu einem M4. Hardware Multiply Accumulation (MAC wie Single*Single --> +=Double) für DSP ist der Punkt, an dem Sie wirklich einen Unterschied sehen. Suchen Sie einfach nach Multiplikationsgeschwindigkeit für M0 im Vergleich zu M4.
Was möchten Sie tun? Wenn Sie Leistung auf dem Cortex-M0 benötigen, sollten Sie wahrscheinlich Festkommaberechnungen mit ganzen Zahlen simulieren.
Ja, ich werde das q31-Format verwenden ... wollte aber mit Float vergleichen
Der Cortex-M0 unterstützt nicht den vollständigen Thumb2-Befehlssatz. Es erlaubt kein gleichzeitiges Verschieben mit anderen Operationen und, was noch wichtiger ist, es enthält keine Anweisung zum Berechnen der oberen 32 Bits einer 32 · 32-Multiplikation.

Antworten (1)

1 und 2: Es gibt keine Hardware-Gleitkommaeinheit auf dem M0, also hängt es allein von Ihrem Compiler ab. Erwarten Sie in der Größenordnung von zehn bis möglicherweise Hunderten von Zyklen für einfache Genauigkeit bei vollständiger IEEE-Kompatibilität. Was die doppelte Genauigkeit betrifft, sehen Sie wahrscheinlich hohe Hunderte, vielleicht sogar die Tausend-Zyklen-Grenze, wobei Sie wiederum volle IEEE-Kompatibilität annehmen.

3: Einzelzyklus.

Beachten Sie, dass eine ganzzahlige 32-Bit- Multiplikation je nach Hardware entweder 1 oder 32 Zyklen dauern kann. IMHO ist es wahrscheinlich, dass es in der Gleitkommamultiplikation verwendet wird, sodass dies Auswirkungen auf die Ausführungszeit haben kann.
Wie wäre es mit gcc ... außerdem dachte ich, die ARM-Kerne seien hardwareunabhängig?
@starblue: Ich denke, Cortex m0 spezifiziert eine 32x32-Multiplikation mit einem Zyklus zu einem 32-Bit-Ergebnis, erlaubt jedoch keine Möglichkeit, eine 32x32-> 64-Multiplikation zu berechnen, außer durch Zerlegen des ursprünglichen Werts in kleinere Teile.
@hassan789 Die Single-Cycle-Multiplikation ist eine optionale Funktion. Von den NXPs-Controllern haben die Standalone-M0s es in der Regel, während die M0s auf den LPC43xx-Multicore-Controllern es nicht haben.
@supercat Ja, das stimmt. Es sollte dennoch die Leistung verbessern, wenn Sie es für 16x16 bis 32 Bit verwenden.
@starblue: Was ist die Multiplikationsleistung auf Maschinen ohne es? Ähnlich wie bei den LPC ARM7-TDMI-Chips [mehrfach in 8x32-Blöcke unterteilen, in diesem Fall wäre eine 8x24-Unterteilung mit dem richtigen Operanden, der der 8-Bit-Operand ist, viel besser als 16x16]?