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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren