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
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.
>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?
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.
> 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.
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...
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)
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.
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.
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.
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
A. K. schrieb:> Was kommt bei -3/2 und -3>>1 raus?> [ ] -1.5> [ ] -1> [ ] -2> [ ] undefiniert> [ ] bluescreen
[ ] durch die jeweilige Compilerimplementation festgelegt
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.
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.