MIPS (Neugier) schneller Weg von clearing ein register?
Was ist der Schnellste Weg von clearing ein register (=0) in MIPS assembly?
Einige Beispiele:
xor $t0, $t0, $t0
and $t0, $t0, $0
move $t0, $0
li $t0, 0
add $t0, $0, $0
Welche ist die effizienteste?
InformationsquelleAutor lois | 2010-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
In vielen MIPS Implementierungen, diese ops wird sowohl kompilieren, um die gleiche Anweisung, weil in der Regel "mov $a, $b' ist ein idiom für
or $a, $b, $0
undli $r, x
ist die Kurzform fürori $r, $0, x
:werden und diese werden beide mit der gleichen pipeline, als architektonisch gleichwertig:
und in jeder RISC-Implementierung mit dem ich gearbeitet habe, fügen Sie auf der gleichen Leitung wie xor/und/noch/etc.
Grundsätzlich ist dies alles, insbesondere die Umsetzung eines einzelnen Chips, aber Sie alle sollten einzelne Uhr. Wenn der chip nicht in Ordnung ist,
li
oderand x, $0, $0
könnte am schnellsten, denn Sie minimieren die falschen Abhängigkeiten zu anderen Registern.memory_order_consume
). So Sie definitiv möchten, verwenden Sie$0
als Ihr nur die input-Quelle zu registrieren, unabhängig davon, was Sie tun. IDK, wenn eine out-of-order MIPS Implementierungen erkennen, die durch bestimmte Nullabgleich Idiome und dabei sogar eine Ausführungseinheit (wie x86 CPUs tun)InformationsquelleAutor Crashworks
Ich glaube mich zu erinnern, dass $0 wurde kreiert speziell für diesen Fall, so würde ich erwarten, dass
move $t0 $0
sollte die empfohlene Methode zum löschen einer Registrierung. Aber ich habe dies nicht getan MIPS für fast 10 Jahre ...InformationsquelleAutor Guillaume
Gegeben, dass alle diese Anweisungen nehmen Sie eine einzelne pipeline-Zyklus, es sollte nicht viel Unterschied zwischen Ihnen.
Wenn überhaupt, würde ich erwarten, dass die
xor $t0, $t0, $t0
am besten für Geschwindigkeit, weil es keine anderen registriert wird, damit Sie frei für andere Werte und potenziell Verringerung der register-Datei Streit.Die xor-Methode ist auch behandelt, wie eine bestimmte Redewendung, die auf einigen Prozessoren, die es erlauben den Einsatz auch weniger Ressourcen (z.B. Verzicht zu tun, das ALU XOR-operation.
mov eax, 0
auch abgesehen von der code-Größe. Da, das ist nicht ein Faktor für MIPS, würde ich nicht erwarten, MIPS CPUs zu verbringen transistoren erkennen, dass beide Operanden das gleiche für xor oder sub. Ich würde auch erwarten, dass das Lesen$0
ist mindestens so Billig wie das Lesen eines anderen reg.InformationsquelleAutor andrewmu
Auf die meisten Implementierungen von MIPS-Architektur, die alle diese sollten die gleiche performance bieten. Allerdings kann man sich vorstellen, einen superscalar-system, das könnte führen mehrere Instruktionen gleichzeitig, so lange, wie Sie nutzen die unterschiedlichen internen Einheiten. Ich habe keine tatsächlichen Beispiel des MIPS-system, das so funktioniert, aber das ist, wie es geschieht, auf PowerPC-Systemen. Ein
xor $t0, $t0, $t0
opcode ausgeführt werden würden, auf den "integer-Berechnungen" - Einheit (denn es ist einxor
), währendmove $t0, $0
würde nicht verwenden, die Einheit; konzeptionell, letztere könnten parallel ausgeführt werden, mit einem anderen opcode, die integer-Berechnungen.Kurz wenn Sie ein system zu finden wo alle die Möglichkeiten, die Sie Liste sind nicht gleich effizient, dann ich würde erwarten, dass die
move $t0, $0
Methode die effizienteste sein.mov x,y
ist in der Regel ein synonym füror x,y,0
. Das war der Fall auf die EE sowieso.Nicht familier mit MIPS, aber ist die move-Anweisung nicht mehr? Auf x86, mehr Hinweise kann oft am Ende läuft länger als die "offizielle" tick count durch-Speicher - /pipelining-Probleme. Kurze Anweisungen werden bevorzugt...
Knoblauch NÖ-der ganze Punkt von MIPS (und RISC im Allgemeinen) ist, dass jeder Anweisung ist genau die gleiche Länge.
Ich würde nicht sagen, es ist der "springende Punkt", aber es ist in der Tat einer der Vorteile von RISC-Architekturen (obwohl es immer ein bisschen weniger ausgeprägt mit 16-bit-Untermengen wie mips16e und Daumen).
InformationsquelleAutor Thomas Pornin
Es hängt wahrscheinlich davon ab, welche anderen Hinweise werden in die pipeline zur gleichen Zeit: wenn das register zuletzt verwendet wurde, wenn es weiter verwendet werden und welche internen Geräte sind derzeit im Einsatz.
Ich bin nicht vertraut mit der pipeline-Struktur nicht von einer bestimmten MIPS-Prozessor, aber mit dem compiler werden sollte, und ich würde erwarten, dass es zu entscheiden, welcher wäre der Schnellste in einem bestimmten code-Sequenz.
InformationsquelleAutor Andrew Aylett
Wie etwa MOVZ? Es sollte rein nur ein MOV ein und sonst nichts.
InformationsquelleAutor albert