2013-04-06 15 views
6

Ich arbeite an einem ARM Cortex-M3 Controller, der den Thumb-2 Befehlssatz hat.ARM Thumb/Thumb-2 Leistung

Der Daumenmodus wird verwendet, um den Befehl auf eine 16-Bit-Größe zu komprimieren. So ist die Größe des Codes reduziert. Aber warum wird beim normalen Thumb-Modus gesagt, dass die Leistung reduziert ist?

Bei Thumb-2, ist es die Leistung wird als pro diesen beiden Verbindungen verbessert:

Verbessern der Leistung in Fällen, in denen ein einzelner 16 -Bit-Anweisung beschränkt Funktionen, die dem Compiler zur Verfügung stehen.

Ein erklärtes Ziel für Thumb-2 war es, eine ähnliche Codedichte wie Thumb mit einer ähnlichen Leistung wie die ARM-Anweisung auf 32-Bit-Speicher zu erreichen.

Was genau ist diese Leistung? Kann jemand ein paar Beispiele dazu geben?

+1

Leistung ist immer relativ. Es gibt viele Fälle, in denen der Daumen-Code besser läuft als der Arm. Hauptsächlich wenn der Speicherbus ein Flaschenhals ist. Im Allgemeinen hat der "Daumen" nicht so viele Register, so dass, obwohl der Befehlssatz kompakter ist, er mit einigen Algorithmen häufiger auf Spei cherregister zugreifen muss. –

+1

Wenn ich einen Lieferwagen A und einen Lieferwagen B habe, der halb so groß wie A ist. Wenn die gelieferte Menge in LKW A passt, aber zwei für LKW B groß ist, wird LKW B doppelt so viele Fahrten machen der gleiche Job. Thumb ist nicht halb so effizient wie ARM, es ist mehr wie 10-15% mehr Anweisungen, um dasselbe wie ARM zu machen. –

+0

Siehe auch: Stackoverflow's [Gcc-mtthumb vs-marm] (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) und [Arizona Papier] (http://www.cs.arizona.com) .edu/~ arvind/papers/lctes02.pdf) auf Thumb- und ARM-geführten Compiles. –

Antwort

6

Im Vergleich zum 32-Bit-ARM-Befehlssatz benötigt der Daumen-16-Bit-Befehlssatz (noch nicht von thumb2-Erweiterungen gesprochen) weniger Speicherplatz, da die Anweisungen halb so groß sind Es braucht mehr Anweisungen, um das gleiche wie am Arm zu tun. Es gibt weniger Merkmale für den Befehlssatz, und die meisten Befehle arbeiten nur mit den Registern r0-r7. Äpfel zu Äpfel Vergleich mehr Anweisungen, um das gleiche zu tun, ist langsamer.

Nun nehmen thumb2 extensions ehemals undefined thumb Anweisungen und erstellen 32-Bit-Daumen-Anweisungen. Verstehen Sie, dass es mehr als einen Satz von thumb2-Erweiterungen gibt. ARMv6m fügt vielleicht ein paar Dutzend hinzu. ARMv7m fügt dem Daumenbefehlssatz etwas wie 150 Anweisungen hinzu, ich weiß nicht, was Armv8 oder die Zukunft halten. ARMv7m vorausgesetzt, haben sie die Lücke zwischen dem, was Sie mit dem Daumen machen können, und dem, was Sie in ARM machen können, überbrückt. So ist Daumen2 ein reduzierter ARM-Befehlssatz wie Daumen, aber nicht so reduziert. Es kann also immer noch mehr Anweisungen geben, um dasselbe in thumb2 (angenommen plus Daumen) zu machen, im Vergleich zu ARM, das dasselbe macht.

Dies gibt einen Vorgeschmack auf das Problem, eine einzelne Anweisung in Arm und seine Entsprechung in Daumen.

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

Jetzt ein Compiler würde nicht das tun, würde der Compiler weiß, dass es durch die Wahl anderer Register Daumen und tun Dinge anders ausgerichtet ist. Sie haben noch weniger Register und weniger Funktionen pro Befehl:

mov r0,r1 
and r0,r2 

nimmt noch zwei Befehle/Ausführungs-Zyklen und zwei Register zusammen, ohne die Operanden modifiziert, und in einem dritten Register das Ergebnis setzen. Thumb2 hat ein drei Register und so sind Sie zurück zu einer einzigen Anweisung mit den Erweiterungen thumb2. Und dieser thumb2-Befehl ermöglicht r0-r15 für jedes der drei Register, in denen der Daumen auf r0-r7 beschränkt ist.

Sehen Sie sich das ARMv5 Architectural Reference Manual an, unter jeder Daumenanweisung sehen Sie den entsprechenden ARM-Befehl. Dann gehen Sie zu dieser ARM-Anweisung und vergleichen Sie, was Sie mit dieser Armanweisung tun können, die Sie mit der Daumenanweisung nicht tun können. Es ist ein Einwegpfad, bei dem die Daumenanweisungen (nicht thumb2) eine Eins-zu-eins-Beziehung mit einer ARM-Anweisung haben.Alle Daumenanweisungen haben eine äquivalente Armanweisung. aber nicht alle Armanweisungen haben eine äquivalente Daumenanweisung. Sie sollten in der Lage sein, aus dieser Übung die Einschränkung der Compiler zu sehen, wenn Sie den Daumen-Befehlssatz verwenden. Holen Sie sich dann das ARMv7m Architectural Reference Manual und schauen Sie sich den Befehlssatz an und vergleichen Sie die "all thumb variants" -Kodierungen (diejenigen, die ARMv4T enthalten) und diejenigen, die auf ARMv6 und/oder v7 beschränkt sind und die Erweiterung von Features zwischen thumb sehen und thumb2 sowie thumb2 nur Anweisungen, die kein Daumen-Gegenstück haben. Dies sollte verdeutlichen, was die Compiler mit Daumen und Daumen zu tun haben2. Sie können dann so weit gehen, um thumb + thumb2 mit den vollen ARM-Anweisungen zu vergleichen (ARMv7 AR ist das, wie es heißt?). Und sehen Sie, dass thumb2 viel näher an ARM kommt, aber Sie verlieren zum Beispiel Conditionals bei jeder Anweisung, so dass bedingte Ausführung in Daumen Vergleiche mit Verzweigungen über Code macht, wo Sie in ARM manchmal ein Wenn-Dann-Else ohne Verzweigung haben können.

+0

auch sehr vorsichtig sein, Cortex-M3 und Cortex-M4 sind ARMv7m, der Kortex-m0 und -m1 sind ARMv6m, viel Unterschied zwischen den Erweiterungen Daumen2 auf diese Befehlssätze, auch die Compiler leckte vorwärts mit dem Cortex-m3 und fügte einen Haufen thumb2 Zeug hinzu, und Sie konnten thumb2 auf dem cortex-m0 nicht benutzen, als es herauskam. Nicht sicher, ob die Compiler (gcc/clang) noch vollständig eingeholt haben. Ebenso hat der Cortex-m4 einen Gleitpunkt, der ein reduzierter Geschmack des Cortex-A ist, und die Compiler hatten mit dem Fließpunkt auf dem Cortex-m4 zu kämpfen, als er herauskam. nicht sicher, ob sie –

+0

aufgeschnappt haben, wenn thumb nur auf register R0-R7 zugreifen kann ... dann wie in ihrem beispiel mov instruktion auf register r8, r9 & r10 benutzt ... bitte vorschlagen? – Katoch

+0

* MOST * Daumen Anweisungen ein paar können insbesondere eine bestimmte Bewegung hoch zu/von niedrig –

6

Thumb-2 führte Befehle mit variabler Länge zum ursprünglichen Thumb; Jetzt können Anweisungen eine Mischung aus 16 Bit und 32 Bit sein. Das bedeutet, dass Sie den Größenvorteil des ursprünglichen Thumb im täglichen Code beibehalten, aber jetzt Zugriff auf fast das gesamte ARM-Feature in komplexem Code haben, jedoch ohne den ARM-Overworking-Overhead, der zuvor von Thumb verursacht wurde.

Abgesehen von dem oben erwähnten Zugriff auf den vollen Registersatz aus allen Registeroperationen, hat Thumb-2 die bedingungslose Verzweigung ohne Verzweigung in der Form des IF-THEN (IT) -Blocks hinzugefügt. Der ursprüngliche Thumb entfernt die Marken-ARM-Funktion der bedingten Ausführung bei fast allen Anweisungen; Dies wird nun in Thumb-2 erreicht, indem der IT-Befehl mit Bedingungen für bis zu vier aufeinanderfolgende Befehle vorangestellt wird.

Zusätzlich wurde der Befehlssatz selbst erheblich erweitert; Zum Beispiel implementiert der Cortex-M4F die DSP-Erweiterung sowie die FPv4-SP Fließkomma-Erweiterung. Tatsächlich glaube ich, dass sogar NEON in Thumb2 codiert werden kann.