STM32F0 Hardware Multiplizierer oder nicht?

Gast #2869716
Lesenswert?
• ▲
▼
Marco M. schrieb:
> Cortex-M0 dürfen die Multipliziereinheit auch iterativ (in 32 Schritten)
> implementieren, das ist dann nicht so viel besser also Software.

Das "nicht soviel besser" ist immer noch eklatant. Stell die Rechnung 
mal  auf wieviele Zyklen der Softwareansatz mit Schiebe- und 
Additionsinstruktionen braucht.
#2869911
Lesenswert?
• ▲
▼
Maxx schrieb:
> Marco M. schrieb:
>> Cortex-M0 dürfen die Multipliziereinheit auch iterativ (in 32 Schritten)
>> implementieren, das ist dann nicht so viel besser also Software.
>
> Das "nicht soviel besser" ist immer noch eklatant. Stell die Rechnung
> mal  auf wieviele Zyklen der Softwareansatz mit Schiebe- und
> Additionsinstruktionen braucht.

Das hängt davon ab, wie deine Eingangsdaten beschaffen sind. Wenn du 
z.B. nur ein 32-Bit Ergebnis erwartest, dann kannst du die Shift-Add 
Geschichte leicht ausrollen und mit zwei Instruktionen pro Bit 
erledigen. Das kann ARM eigentlich sehr gut:
1
// unsigned multiplikation in ARM Mode
2
mov res,#0
3
tst a, #1   
4
movne res,b 
5
tst a, #2                  // if (a & 2) 
6
addne res,res,b,asl #1     //   res+=b<<1;
7
tst a, #4                  // if (a & 4) 
8
addne res,res,b,asl #2     //   res+=b<<2;

Der Cortex-M0 kann aber nur Thumb, da hätte müsste man also einen Test 
mit Sprung machen. Bei einer 32x32=>64 Multiplikation kommt man so auf 
2-6 Operationen pro Bit. Der allgemeine Fall dürfte also sowas wie 128 
Zyklen liegen. Allerdings könnte man mit Sprungtabellen die auf 
Multiplikationen mit Konstanten verweisen, die Zeit auf 2-3 Zyklen pro 
gesetztem Bit im Multiplikator runterkriegen.

Der allgemeine Fall dürfte also wohl so um den Faktor 3-4 langsamer 
sein. Spezialfälle können dann wieder schneller sein. Wenn du z.B. 
Operanden mit einem eingeschränkten Definitionsbereich (z.B. 0<=x<=1023) 
hast, dann kannst du deine Softwareroutine so anpassen, daß sie nur die 
benötigten Bits überhaupt anschaut. Ein 10x18 Bit Multiplizierer muss 
maximal 10 Mal Shiften/Addieren und hat keinen Überlauf zu verarbeiten.

Bei einem one-cycle Multiplizierer kann man sich diese Überlegungen 
allerdings schenken, der ist dann einfach 100-200 Mal schneller und 
fertig.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.