2010-03-17 3 views
5

Ich studiere JIT Design in Bezug auf dynamische Sprachen VM-Implementierung. Ich habe seit den 8086/8088 Tagen nicht viel Assembly gemacht, nur ein bisschen hier oder dort, also sei nett, wenn ich nicht in Ordnung bin.P6 Architektur - Register Umbenennung, führen die begrenzten Benutzer-Register zu mehr Operationen verschwendet/laden?

Wie ich es verstehe, hat die x86 (IA-32) -Architektur immer noch die gleichen grundlegenden begrenzten Register gesetzt, wie sie es immer tat, aber die interne Registerzahl ist enorm gewachsen, aber diese internen Register sind nicht allgemein verfügbar und sind verwendet mit Registerumbenennung, um paralleles Pipelining von Code zu erreichen, der ansonsten nicht parallelisierbar wäre. Ich verstehe diese Optimierung ziemlich gut, aber mein Gefühl ist, während diese Optimierungen im Gesamtdurchsatz und für parallele Algorithmen helfen, der begrenzte Registersatz immer noch mit mehr Registerüberlauf-Overheads zu tun hat, so dass x86 doppelt oder vierfach die Register hatte verfügbar für uns, kann es deutlich weniger Push/Pop-Opcodes in einem typischen Befehlsstrom geben? Oder gibt es andere Prozessoroptimierungen, die das auch optimieren, von denen ich nichts weiß? Grundsätzlich, wenn ich eine Code-Einheit habe, die 4 Register hat, um mit Integer-Arbeit zu arbeiten, aber meine Unit hat ein Dutzend Variablen, habe ich potentiell einen Push/Pop für jede 2 oder so viele Anweisungen.

Irgendwelche Verweise auf Studien, oder besser noch, persönliche Erfahrungen?

EDIT: x86_64 hat 16 Register, die doppelt x86-32 ist, danke für die Korrektur und Info.

Antwort

9

Zusätzlich zum Umbenennen von Registern, um Blasen aufgrund von Befehlslatenzen zu verbergen, sind die meisten x86-Architekturen schlau genug, um Pushs und Pops zu zählen und diese auch in Register umzubenennen. Denken Sie daran, dass der Befehlsdecoder auf dem x86 tatsächlich eine Art JIT-Kompilierung durchführt, wodurch der x86-Befehlsstrom in ein kleines Mikrocode-Programm umgewandelt wird, das im Trace-Cache gespeichert ist. Ein Teil dieses Prozesses beinhaltet das Abfangen von kleinen Offset-Stapellasten und deren Umwandlung in Register. So etwas wie (die offensichtlich dumm und rein zum Beispiel):

lwz eax,[ebp] 
lwz ebx,[ebp+4] 
add eax,[edx+0] 
push eax 
lwz eax,[ebp+8] 
add eax,ebx 
pop ebx 
add eax,ebx 

Köche in so etwas wie (interne Register vorgeben werden genannt zB r0..r16):

lw r3, edx 
lw r1, ebp 
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand 
add r1,r2 
or r4,r1,r1 ;; move r1 to r4 
lw r1, ebp+8 
add r1,r2 
or r2,r4,r4 
add r1,r2 

Natürlich eine magisch Ein intelligenter Dekodierer (anders als der, der tatsächlich in die Transistorzählung passt) würde einige der unnötigen Bewegungen dort reduzieren, aber der Punkt, den ich mache, ist, dass Push/Pop und Speichern/Laden zu esp+(some small number) tatsächlich in Schattenregister umgewandelt werden.

+0

denken Dank CrashWorks, große Antwort. Hast du eine gute Referenz dafür? Ich habe mehrere Architekturbücher und keiner von ihnen erwähnt dies, aber es war mein Verdacht, dass so etwas vorging. – codenheim

+1

Sie können einen Großteil dieser Informationen aus Kapitel 2 des Optimierungshandbuchs von Intel (http://www.intel.com/products/processor/manuals/) ableiten. Sie können auch einige kontrollierte Experimente durchführen, um einige der "Black Box" -Einbauten herauszufinden. Und Sie könnten immer wieder durch Intels Patente stochern: Schließlich ist es das Ziel eines Patents, Ihnen zu sagen, wie es funktioniert! # 5740414 könnte ein Ort zum Starten sein. – Crashworks

+0

Danke, gute Punkte. Der erste Schritt besteht darin, neuere Handbücher zu bestellen als meine 15 Jahre alten.:) – codenheim

4

Zwei Punkte:

(1) X86-64 die Anzahl der Register auf 16 verdoppelt

(2) in der modernen x86 CPUs, ein Befehl, der eine Speicherstelle verwendet, die bereits in L1-Cache ist, fast so schnell wie die gleiche Operation mit einem Register-Operand, so können Sie fast L1 als "Register-Speicher"

+0

Re: (2) - Ich habe die Latenz eines L1 * hits * auf meinem i7 mit etwa 9 Zyklen gemessen, was (erstaunlicherweise) langsamer ist als das Core Duo. – Crashworks

+0

Wie hast du das gemacht? Es sollte nur 2 Zyklen auf einem Core i7 geben, denke ich, was kein Problem bei einem einigermaßen gut geplanten Befehlsstrom sein sollte. –

+0

Re: (1), Zeit, um meine Hardware-Handbücher zu aktualisieren. Ich habe 386, 486 und Pentium, aber nichts neueres. Danke euch beiden für die Antworten. – codenheim

Verwandte Themen