2009-04-26 7 views
6

Ich habe irgendwo gelesen, dass effektive Adressen (wie in der LEA-Anweisung) in x86 Anweisungen von der "EU" berechnet werden. Was ist die EU? Was genau ist mit der Berechnung einer effektiven Adresse verbunden?Was ist die "EU" in der x86-Architektur? (berechnet effektive Adresse?)

Ich habe nur über den MC68k Befehlssatz erfahren (UC Boulder unterrichtet dieses zuerst) und ich kann eine gute x86 Webpage durch google =/nicht finden.

Danke!

+0

Siehe die [x86-Tag-Wiki] (http://Stackoverflow.com/tags/x86/info) für gute Links zu x86-Hardware-Details, vor allem http://agner.org/optimize/ –

Antwort

3

"EU" ist der Oberbegriff für die Ausführungseinheit. Die ALU ist ein Beispiel für eine Ausführungseinheit. FADD und FMUL, d. H. Der Gleitkommaaddierer oder -multiplizierer, sind andere Beispiele - wie dies für die Speichereinheit zum Laden und Speichern ist.

Die für LEA-Anweisungen relevanten EUs sind die ALU (add, subtract, AND/OR usw.) und die AGU (Address Generation Unit). Die AGU ist an die Speicher-Pipelines, TLB, Daten-Cache, etc.

Eine typische Intel x86 CPU zurück, als ich den ersten Codegen Leitfaden geschrieben hatte 2 ALUs, 1 laden Pipeline an eine AGU gebunden, eine Geschäftsadresse Pipeline gebunden zu einer zweiten ALU und einer Speicherdatenpipeline. Ab 2016 haben die meisten 3 oder 4 ALUs.

LEA ist eine Anweisung mit 3 Eingängen - BaseReg + IndexReg * Scale + Offset. Genau wie der Speicheradressierungsmodus von x86, der tatsächlich einen vierten Eingang hat, die Segmentbasis, die nicht Teil der LEA-Berechnung ist. 3 Eingänge kosten notwendigerweise mehr als die 2 für ADD benötigten Eingänge.

Bei einigen Maschinen kann die ALU nur 2 Eingabeoperationen ausführen. LEA kann daher nur auf einer AGU ausgeführt werden, speziell der AGU, die zum Laden verwendet wird (weil die Speicher-ALU kein Register schreibt). Dies kann bedeuten, dass Sie LEA nicht gleichzeitig mit Load oder zwei LEAs gleichzeitig ausführen können, während Sie im selben Zyklus zwei Adds und einen Load hinzufügen können.

Auf anderen Maschinen kann LEA mit einer, zwei oder drei ALUs durchgeführt werden. Möglicherweise anstelle der AGU - möglicherweise ebenso wie die ALU. Dies beweist mehr Flexibilität.

Oder die einfachen LEA, zB reg Skala + Offset, können auf den ALUs erfolgen, während die größte LEA, zB breg + ireg Skala + Offset, beschränkt sein kann, oder möglicherweise sogar in zwei Uops gebrochen.

(Ouch.. Die App auf < < abgeschnitten, wahrscheinlich ein HTML quotification Fehler, den ich an einem PC beheben kann Ah - fest von < < zu * ändern.)

So kommt die Frage nach unten zu: Welche EU (Execution Unit) handhabt welche LEAs? Die ALU oder die AGU? Die Antwort hängt von der Maschine ab.

Generischer Text in einem Optimierungsleitfaden kann einfach "EU" anstatt "AGU oder ALU, je nach Modell" oder "welche EU in der Lage ist, diese bestimmte LEA zu handhaben" sagen.

+0

Auch "typisch" x86-CPUs haben heutzutage 3 ALU-Ports/Pipes und 2 Load-Ports, es sei denn, Sie schauen sich Low-Power-Designs wie Silvermont an. Haswell + hat 4 ALU-Ports. Nur die AMD Bulldozer-Familie hat immer noch nur 2 Ganzzahl-ALU-Ports pro Integer-Kern, und das ist eine Art von SMT mit fester Partitionierung.K8/K10 hatte einen Durchsatz von 3 ADDs pro Takt. Und ich bemerke, dass Sie nicht versucht haben, in die Komplexität von 2 ALU * -Ports * zu kommen, sondern viele spezialisierte ALUs (zB skalare ganzzahlige Einheit + Vektor FP-Einheit + andere Komponenten auf Port 0 vieler Intel P6/SnB-Familie)). –

+1

Nein, Peter, ich bin nicht auf die Komplexität von Gruppen spezialisierter EU eingegangen, die Start-Ports und Completion-Ports teilen, geschweige denn RF-Lese- und Schreib-Ports, flexible Latenzen usw. Es war schwer genug, diese Probleme im Intel-Compiler-Writer zu erklären Anleitung, als ich die erste Version für P6 circa 1994 schrieb. Zu schwer, um in Stackoverflow fitmaf und primitive Formatierung zu passen. –

+0

Yup, Sie müssen die Linie irgendwo auf wie viel Detail ziehen, um in eine Antwort zu setzen. Ich habe gerade Häfen + spezialisierte EU als Fußnote für begeisterte Leser erwähnt. Nettes Update; genauer + korrigieren, während immer noch nett und kurz sein. –

3

EU = Ausführungseinheit?

Die effektive Adresse ist die Adresse, auf die zugegriffen worden wäre, wenn die Anweisung LEA eine Anweisung gewesen wäre, die tatsächlich irgendeine Art von arithmetischem oder anderem Datenzugriff ausgeführt hat. Seine "beabsichtigte" Verwendung besteht darin, den resultierenden Zeiger aus einer Zeigerarithmetik oder einer Array-Indizierungsoperation zu berechnen. Da es jedoch eine Kombination aus Multiplizieren und Addieren ausführen kann, wird es auch zur Optimierung einiger regulärer Berechnungen verwendet.

0

Die Interna von Prozessoren innerhalb einer Familie haben sich im Laufe der Jahre stark verändert, so dass die "EU" -Referenz mit dem genauen CPU-Modell geklärt werden müsste. Als eine Analogie zu Ihrer m68k-Erfahrung ist der Befehlssatz für 68000, 010, 020, 030, 040 und 060 meistens der gleiche, aber ihre Interna sind wirklich unterschiedlich, so dass jeder Verweis auf einen internen Namen mit ihrer Teilenummer kommen muss.

6

Intels eigene Software Developer's Manuals sind eine gute Quelle für Informationen über das x86, obwohl sie ein bisschen ein Overkill sein können (und eher Referenz-like als Tutorial-like).

Die EU-Referenz (Execution Unit) war höchstwahrscheinlich im Gegensatz zur ALU (Arithmetic Logic Unit), die normalerweise der Teil des für arithmetische und logische Befehle zuständigen Prozessors ist. Die EU verfügt jedoch (oder hatte) auch über einige Rechenfunktionen zur Berechnung von Speicheradressen. Der x86-LEA-Befehl übermittelt diese Fähigkeiten dem Montageprogrammierer.

Normalerweise können Sie einige ziemlich komplexe Speicheradressen zu einem x86-Befehls liefern:

sub eax, [eax + ebx*4 + 0042] 

und während die ALU die arithmetische Subtraktion behandelt, ist die EU für die Erzeugung der Adresse verantwortlich.

Mit LEA, können Sie die begrenzten Adresserzeugenden Fähigkeiten für andere Zwecke verwenden:

lea ebx, [eax + ebx*4 + 0042] 

Vergleichen mit:

mul ebx, 4 
add ebx, eax 
add ebx, 0042 

"Volume 1" auf der Seite, die ich verlinkt habe hat ein Abschnitt "3.7.5" Adressierungsmodi - welche Art von Speicheradressen können Sie einem Befehl zuführen, der einen Speicheroperanden erwartet (von dem LEA eins ist), der angibt, welche Art von Arithmetik der EU (oder wie auch immer der Speicherschnittstellenteil heißt) ist fähig zu.

"Volume 2" ist die Befehlssatzreferenz und enthält definitive Informationen zu allen Anweisungen, einschließlich LEA.

+1

Ich frage mich, welche ist schneller/effizienter; die lea-Anweisung oder die mul-, add-, add-Combo, da sie von verschiedenen Einheiten (EU/ALU) verarbeitet werden. –

+2

Es ist wirklich schwer zu sagen mit all den mehrstufigen Pipelines, Multi-Cores, Multi-Units von heute. Die EU kann für eine solche Berechnung frei sein, während die ALUs beschäftigt sind und umgekehrt. Ich bin mir nicht einmal sicher, ob der Unterschied zwischen EU und ALU tatsächlich existiert. – aib

+0

Eine ALU ist eine Art von EU (die Art, die Anweisungen zum Hinzufügen und Verschieben ausführen kann). Andere Arten sind eine Ladeeinheit oder eine Speichereinheit, die diese Ups ausführen kann. [Krazy Glews Antwort] (http://stackoverflow.com/a/11389785/224132) zu dieser Frage erklärt weitere Details. (Andy Glew war einer der Architekten von Intels P6-Design. Seine Erklärung der Intel-Terminologie ist korrekt, und @ TonyR sollte diese Antwort akzeptieren). Und die Verwendung von 'lea' ist immer ein Gewinn, wenn Sie mehr als eine andere Anweisung ersetzen können. Es ist ein großer Gewinn, wenn Sie alle 4 ersetzen können (shift, 'add' und' add'-sofort und 'mov'). –