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...
Ist natürlich klar, dass shiften nicht genau ist bzw. die Nachkommazahl wegschneidet...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.