Muh,
mal ein paar Infos:
x86-Architektur (bis i586 (P55C aka Pentium MMX)):
8x 32bit GPRs
- EAX, EBX, ECX, EDX, ESI, EDI für Arithmetische Berechungen, Variablen etc.
- EBP, ESP, EIP für Pointer
5x 16bit Segment Register:
- CS, DS, ES, FS, GS, SS für Segmentselektoren in der GDT/LDT
8x 80bit FP-Register
- ST0..ST7 für 32bit (FLOAT), 64bit (DOUBLE) und 80bit (EXTENDED) Berechunungen
plus diverse Flag-Register (EFLAGS) und Model-Specific Registers (MSRs ab Pentium)
Ab dem Pentium-Pro/PII (i686) werden diese wenigen Register auf ein wesentlich grösseres Shadow-Registerfile abgebildet (damit Out-Of-Order Execution auch funktioniert). Der Programmierer kann diese nicht direkt ansprechen.
Nun zu den SIMD-Erweiterungen:
MMX (ab P55C) aliased 8x 64bit Register MM0..MM7 auf den 80bittigen FPU-Registern und ermöglicht es 8x 8bit BYTEs, 4x 16bit WORDs oder 2x 32bit DWORDs parallel zu verarbeiten.
Es ist entweder FP ODER (Integer) MMX möglich - aber nicht beides gleichzeitig.
3DNow! (ab K6) ermöglicht auf diesen MM-Registern zusätzlich 2x 32bit FLOATs (nach IEEE754).
SSE (ab P3/Athlon XP) enthält 8x 128bittige Register XMM0..XMM7 in einer neuen Funktionseinheit.
Dort sind 4x 32bit FLOATs pro Register unterbringbar für SIMD-Berechnungen. Alternativ kann man durch skalare Operationen nur das unterste Element benutzen. Dies ist primär dafür gedacht die total bekloppte stackbasierte (Stack in einem Registerfile!!) x87-FPU zu ersetzen.
Skalarer SSE Code is wesentlich fixer als herkömmlicher (skalarer) FP-Code.
SIMD-Berechnungen sind _nur_ effektiv wenn die Daten schnell in die Register geladen werden können. Dazu gibt es alignte Speicherzugriffsroutinen (MOVAPS) gegenüber unalignten (MOVUPS). Diese Befehle benötigen ein Ausrichtung Daten im Speicher auf eine 128bit Grenze (16 Bytes).
Großer Nachteil von SSE: Keine 64bit DOUBLEs in den XMM-Registern, ebenfalls keine Integer-Operationen.
SSE2 (ab P4/Athlon64) ermöglicht es nun auch in den 8x 128bittigen XMM-Registern zwei 64bit DOUBLEs unterzubringen. Ebenfalls kann (wie bei SSE) nur das unterste Element verwendet werden für skalare Berechnungen. Ausserdem ermöglicht SSE2 es mit 16x 8bit BYTEs, 8x 16bit WORDs, 4x 32bit DWORDs oder 2x 64bit QWORDs (oder 1x 128bit DQWORD) in den Registern zu arbeiten. SSE2 ist also eine Zusammenfassung von MMX+SSE plus Unterstützung von 64bit DOUBLEs.
SSE3 (ab P4-Prescott/Athlon64-Venice) erweitert SSE2 nur um lausige 10 Befehle, davon 2 für Barriers, 1 Integer, 4 Speicherzugriffsbefehle und 3 für SIMD-Berechnungen (HADDPS/PD) mit der man endlich (oh endlich nach fünf Jahren) das Skalarprodukt einfach berechnen kann.
Fassen wir zusammen:
- MMX+3DNow!: 8x 64bit MM-Register (mit denen der x87 FPU überlagert)
- SSE+SSE: 8x 128bit XMM-Register (eigene Funktionseinheit).
Mit dem Opteron und nun auch mit dem Athlon64 bzw. dem P4 mit E32MT wird
das ganze noch einmal erweitert. Es werden 16 neue 64bit breite Register R0..R15 eingeführt. Die unteren 8 davon enthalten in den unteren 32bit die altebekannten Register EAX, EBX, ECX, EDX, ESI, EDI, EBP und ESP - die oberen 8 werden erst aktiv wenn man in den 64bit Modus schaltet. Zusätzlich wird die Registeranzahl von SSE von 8 XMM-Register ebenfalls noch einmal verdoppelt auf insgesamt 16 (XMM0..XMM15).
Der PowerPC G3/G4 ist eine 32bit Implementation der 64bittigen PowerPC-Architektur welche IBM mit Motorola (und Apple) ins Leben rief, um die 32bittigen 68000er Prozessoren (68030/68040) des Apples (welche schon 8 Datenregister D0..D7 plus 8 Addressregister A0..A7 (A7 implizit SP)) abzulösen. Der PowerPC entstand aus der schon etwas älteren POWER-Architektur von IBM (welche z.Z. mit dem POWER5 immer noch aktuell ist). Die 32bit Implementation enhielt von Anfang an 32x 32bit Register GPR0..GPR31 plus 64x 32bit FP Register FPR0..FPR63. Wenn ich mich recht entsinne konnten je zwei 32bit FP-Register zu einem 64bittigen kombiniert werden (für DOUBLEs). Der PPC 601 bis 603 von Motorola ähnelte in der Architektur dem Pentium (superskalar), der 604 etwa dem PPro. Die e-Versionen (603e/604e) waren (kastrierte) Lower-Power Versionen für Notebooks (bei Apple heissen die Powerbooks und eigentlich nicht ohne Grund ;-). Der PPC 750 (G3) von Motorola war eine Neuentwicklung und ähnelte ebenfalls dem G3. Der G4/G4+/G4e war eine Weiterentwicklung dessen für höhere Taktraten.
Nach dem G4 bekam es Motorola nicht hin höhrere Frequenzen zu erreichen und schmiss das Mikroprozessor-Geschäft hin. Da Apple da ein bisserl dumm aus der Wäsche geguckt hat, haben sie bei Uncle Blue nachgefragt und heraus kam der G5 aka PPC970. Dieser ist ziemlich kompatibel zu den Vorgängern aber von Grund auf eine 64bit Implementation. Da der PowerPC von Anfang an für 64bit designed war musste hier nicht so gepfuscht werden wie bei x86-64 (64bit Erweiterung einer 32bit Erweiterung (i386) eines 16bit Mikroprozessors (i8086) der als Verbesserung eines 8bit Chips (i8080) entwickelte wurde, welcher von einem 4bit Taschenrechner abstammt (i4004)). Die Registerzahl bleibt bei 32 GPRs und 64 FPRs, alle nun 64bit breit.
Die Altivec SIMD-Erweiterung (seit dem G4) bringt 32 neue 128bittige Register für 8, 16 und 32bit Integers sowie 32bit Floating-Point Daten. Keine Unterstützung für 64bit Doubles. Bei der x86-Architektur gibt es nur 2 Operanden pro Befehl, etwa:
MMX: PADD MM0,MM1 (MM1 und MM0 werden addiert und in MM0 gespeichert)
SSE: ADDPS XMM0,XMM1 (XMM1 und XMM0 werden addiert und in XMM0 gespeichert)
ADDP
AltiVec dagegen kann (wie jeder Befehl beim PowerPC), drei Operanden pro Befehl ausführen:
vaddfp vr0,vr1,vr2 (addiere v0 und v1, speichere das Ergebnis in v2)
IA-64 (Itanium) von Intel dagegen ist eine von Grund auf neu designte Architektur mit 128 64bit Allzweckregistern GPR0..GPR127, 128 64bit Floating-Point Registern FR0..FR127 sowie 64 1bit Predicate-Register (für das Ergebnis von Vergleichen) und noch eine ganze Menge mehr. Die Architektur ist von Anfang an auf explizites Scheduling der Befehle durch den Compiler ausgelegt (EPIC). Hier muss der Prozessor nicht mehr Befehle dynamisch auf seine FUs verteilen sondern dies wird beim Kompilieren vom Compiler schon durchgeführt.
Über MIPS könnte ich auch noch was schreiben...
Fazit:
Ich halte von einer hohen Registeranzahl in einer ISA (Instruction Set Architecture) sehr viel. Lokale Variablen und Addressen sollten besser in den Registern zwischengespeichert werden (sofort verfügbar) statt ständig aus den Caches (L1-3) gefetcht werden zu müssen. Je 32 bis 64 GPR und FPR Register sind da denke ich wünschenswert. Register-Starvation wie bei x86 ist denke ich mal kein Geschenk für einen Compilerbauer.
x86 ist veraltet. Punkt.
Ständig wurde irgendwas angeflanscht. Improvisation par excellence. Die RISC-Architekturen (IBM's POWER/PowerPC, SGI's MIPS4, Sun's UltraSPARC, HP's PA-RISC, Digital's Alpha, Intel's IA-64) sind zwar wesentlich eleganter, aber durch eine hohe Anzahl an FUs und Out-of-Order Execution haben sich die x86-CPUs trotzdem wacker halten können (sogar ganz vorne ;-).
Um es kurz zu fassen:
"The x86 isn't all that complex - it just doesn't make a lot of sense."
Mike Johnson
Leader of 80x86 Design at AMD,
Microprocessor Report (1994)
Infos unter:
G4 vs P4:
http://arstechnica.com/articles/paedia/cpu.ars (Hannibal Stokes)
x86/IA-32: The IA-32 Intel® Architecture Software Developer's Manual, Volume 1 - 3 (Intel)
x86-64/AMD64: AMD64 Architecture Programmer's Manual Volume 1 - 4 (AMD)
PPC: PowerPC Microprocessor Family - Programming Environments Manual for 64 and 32-bit Microprocessors (IBM)
IA64: Intel® Itanium® Architecture Software Developer's Manual, Volume 1 -3 (Intel)
Allgemein: Computer Architecture - A Quantitative Approach (Hennessey & Patterson) <- lesenswert!
Dieses Posting kommt zwar etwas zu spät, ich hoffe doch dass Ihr damit nicht mehr so im Dunkeln herumstochert - sorry ich konnt's einfach nicht ertragen
Cheers,
Vasco