Forum: Mikrocontroller und Digitale Elektronik Multiplikation/Division VS Shiften


von Maria (Gast)


Lesenswert?

Hallo zusammen,

ich weiß, dass das shiften um z.B. 2 stellen (>>2), gleich der Division 
um 4 ist.
Auch weiß ich, dass das Shiften schneller ist (shiften um 2 stellen --> 
2 Taktzyklen).
Wie kann ich ausrechnen/abschätzen wie lange der Microcontroller 
benötigt um z.B. eine unsigned short Zahl/ BYTE -Rechenoperation 
durchzuführen.
(16-Bit-Microcontroller)..

Vielen Dank im voraus!
Grüße
Mary

von Klaus W. (mfgkw)


Lesenswert?

Code anschauen und Ausführungszeiten addieren, oder messen

Abgesehen davon sind Compiler bei eingeschalteter Optimierung
meistens auch nicht so blöd, die langsamste mögliche Variante
zu verwenden.
Insofern hat man meistens andere Baustellen, wo man selbst eher
Aufwand investieren sollte.

von Guru (Gast)


Lesenswert?

>Wie kann ich ausrechnen/abschätzen wie lange der Microcontroller
>benötigt um z.B. eine unsigned short Zahl/ BYTE -Rechenoperation
>durchzuführen.

Die genaueste Methode, ist es, sich den Algorithmus in Maschinensprache 
anzuschauen und zu den verwendeten Befehlen die Anzahl Zyklen 
nachzuschlagen. Ausserdem ist zu beachten, dass evtl. bei einigen 
Operationen der Kontrollfluss von den Werten der Operanden selbst 
abhängt. Es mag z.B. ganz simpel so sein, das eine Multiplikation prüft 
ob einer der Faktoren 0 ist. Dann ist die Zeit natürlich im wesentlichen 
durch die Prüfung und das setzen des Ergebnisses auf 0 bestimmt.

Das ganze ist, denke ich ziemlich aufwendig.

Die nächst simplere Methode ist, die Operation mit einer Reihe von 
verschiedenen, zufällig gewählten Operanden etwas 100 oder 1000 Mal 
durchzuführen und dann den Durchschnittswert zu nehmen.

Das ist einfacher, berücksichtigt aber eventuelle Sonderfälle nur 
graduell ausreichend. Es kommt vor allem darauf an, möglichst viele 
verschiedene Operanden zu wählen. Dann stimmt die Statistik um so 
besser.

Wozu brauchst Du das denn, wenn ich fragen darf?

von Wilhelm F. (Gast)


Lesenswert?

Maria schrieb:

> Wie kann ich ausrechnen/abschätzen wie lange der Microcontroller
> benötigt um z.B. eine unsigned short Zahl/ BYTE -Rechenoperation
> durchzuführen.

Was du auf jeden Fall machen kannst, ist, eine Berechnung einfach 
auszuprobieren. Indem du bei Eintritt in die Funktion einen Timer 
startest, und am Ende den Timer stoppst und den Timerwert ausliest.

Oder einen Pin umschaltest, und mit einem externen Frequenzzähler die 
Zeitdauer messen.

Die Rechenalgorithmen haben ja oft auch die Eigenschaft, daß die 
Berechnungszeit von den Operanden abhängig ist. Wenn man das genau 
wissen will, das ist dann natürlich etwas Aufwand.

von X- R. (x-rocka)


Lesenswert?

> ich weiß, dass das shiften um z.B. 2 stellen (>>2), gleich der Division
> um 4 ist.

Nein! Wenn man zB mittelt zur Erhöhung der Auflösung (zB ADC 
Oversampling), dann gibt dir shiften nicht die Nachkommastellen, die die 
erhöhte Auflösung darstellen. Außer du shiftest zuerst die Summe nach 
links.

von Maria (Gast)


Lesenswert?

Schreibe momentan meine Diplomarbeit und da haben sie mir den "Tip" 
gegeben, wenn möglich statt Division/Multiplikation eine shift-Operation 
durchzuführen.
Aber das mit den Asembler-Befehlen ist eine gute Idee. Das werd ich mir 
mal anschauen. Danke!
Ich hatte gedacht, dass wir irgendetwas schon einmal in einer Vorlesung 
gehabt haben, wie man die Zyklenzahl bestimmt...

von Maria (Gast)


Lesenswert?

Ist natürlich klar, dass shiften nicht genau ist bzw. die Nachkommazahl 
wegschneidet...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Maria schrieb:
> Hallo zusammen,
>
> ich weiß, dass das shiften um z.B. 2 stellen (>>2), gleich der Division
> um 4 ist.

Nein, für signed-Werte ist das schon falsch.

> Wie kann ich ausrechnen/abschätzen wie lange der Microcontroller
> benötigt um z.B. eine unsigned short Zahl/ BYTE -Rechenoperation
> durchzuführen.

Das ist von zig Sachen abhängig, z.B:

- welche Operanden sind es (z.B. zur Compilezeit bekannt)
- welche Instruktionen er verwendet
- deren Reihenfolge (wegen Pipeline)
- deren Ablage (Instruktions-Cache)
- Ablage der Daten (Daten-Cache)
- Art der Speicher (Zugriffszeiten, Wait-States)

von KLaus (Gast)


Lesenswert?

Ich arbeite z.B. mit Microchips MPLAB. Das hat eine einebaute Stoppuhr 
und gibt dir die vergangene Zeit und die benötigten Takte zwischen zwei 
breakpoints aus.

von (prx) A. K. (prx)


Lesenswert?

Klaus Wachtler schrieb:

> Abgesehen davon sind Compiler bei eingeschalteter Optimierung
> meistens auch nicht so blöd, die langsamste mögliche Variante
> zu verwenden.

Bei Optimierung auf Platz kann das durchaus passieren. Das Drumherum 
beim Schieben von Typen mit Vorzeichen wird oft umständlicher sein als 
eine Division bzw. der Aufruf der entsprechenden Laufzeitfunktion.

von (prx) A. K. (prx)


Lesenswert?

Maria schrieb:

> Wie kann ich ausrechnen/abschätzen wie lange der Microcontroller
> benötigt um z.B. eine unsigned short Zahl/ BYTE -Rechenoperation
> durchzuführen.

Lässt sich ohne Kenntnis des konkreten Controllers nicht mal annähernd 
einpeilen.

von DirkB (Gast)


Lesenswert?

Johann L. schrieb:
> Nein, für signed-Werte ist das schon falsch.

Warum?

von (prx) A. K. (prx)


Lesenswert?

DirkB schrieb:

>> Nein, für signed-Werte ist das schon falsch.
>
> Warum?

Was kommt bei -3/2 und -3>>1 raus?
[ ] -1.5
[ ] -1
[ ] -2
[ ] undefiniert
[ ] bluescreen

von Yalu X. (yalu) (Moderator)


Lesenswert?

A. K. schrieb:
> Was kommt bei -3/2 und -3>>1 raus?
> [ ] -1.5
> [ ] -1
> [ ] -2
> [ ] undefiniert
> [ ] bluescreen

  [ ] durch die jeweilige Compilerimplementation festgelegt

von Wilhelm F. (Gast)


Lesenswert?

Maria schrieb:

> Schreibe momentan meine Diplomarbeit und da haben sie mir den "Tip"
> gegeben, wenn möglich statt Division/Multiplikation eine shift-Operation
> durchzuführen.

Schau dir doch mal Divisionsroutinen in Assembler an. Es gibt da 
massenhaft Material im Internet. Lade dir irgendwo einen 
Freeware-C-Compiler herunter, und analysiere die Rechenroutinen. 
Meistens wird tatsächlich entweder geshiftet oder subtrahiert. Eine 
Division ist ja auch eine fortgesetzte Subtraktion.

Und mit den verschachtelten Schleifen ist es ja so, daß es irgendwie 
eine Funktion n-ten Grades wird, in der einfachsten Form z.B. y=ax+b.

Beim reellen µC ist die Taktzeit von vielen verschiedenen Faktoren 
abhängig, z.B. Flash-Zugriffszeiten, Wait-States, Betriebsmode des 
Flashs, programmierbarer Takt, da wird man mit Ermitteln der Zeiten 
wirklich nicht mehr fertig, wenn man alles genau wissen möchte. Ich 
hatte mal mit LPC2000 (ARM7) zu tun. Da wird man wahnsinnig, wenn man 
Befehlszeiten errechnen will. Das Zusammenzählen der Takte ist da das 
geringste Problem, aber wenigstens das geht. Vielleicht ist ja auch nur 
dieses erst mal wichtig, nicht die reelle Laufzeit.

von Guru (Gast)


Lesenswert?

Ich denke, Du solltest auch berücksichtigen, das je nach Prozessor evtl. 
eine Multiplikations-/Divisionseinheit eingebaut ist. Prozessoren, die 
das nicht haben, multiplizieren bzw. dividieren mittel schieben und/oder 
Addition/Subtraktion. Die Laufzeit kann da, abhängig von den Operanden, 
schon um Grössenordnungen unterschiedlich sein.

Wenn es wirklich darum geht, noch das letzte Quentchen Laufzeit 
herauszuhölen musst Du schon genauer die hier genannten Faktoren 
berücksichtigen. Fuer eine allgemeine Aussage in einer Untersuchung über 
Prozessoren vielleicht nicht ganz so tief.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.