PowerPC - Weblearn
Transcription
PowerPC - Weblearn
Referat Rechner-Strukturen-Labor PowerPC Laborgruppe: Christina Priebe Carsten Wellbrock Stefan Rauer 33253 32412 32496 Inhalt 1 2 3 4 5 Die Geschichte des PowerPC G1-G4...........................................................................................2 1.1 Das PowerPC - Konsortium................................................................................................2 1.2 PowerPC Prozessoren ..........................................................................................................3 1.3 G1 anhand des PPC 601.......................................................................................................5 1.4 G2 anhand des PPC 604.......................................................................................................9 1.4.1 Instruction Flow .........................................................................................................12 1.5 G3 anhand des PPC 750.....................................................................................................13 1.6 G4 anhand des MPC 7400 .................................................................................................15 1.7 Der G5................................................................................................................................16 Der PowerPC 970 Prozessor ......................................................................................................17 2.1 Die AltiVec-Erweiterung ...................................................................................................18 2.2 Die Architektur des 970 Prozessors ...................................................................................28 2.2.1 Front End ...................................................................................................................29 2.2.1.1 Branch prediction Konzepte...................................................................................30 2.2.1.2 Decode, cracking und group formation..................................................................30 2.2.2 PowerPC 970 Execution Core ...................................................................................34 2.2.2.1 Rename Register ....................................................................................................35 2.2.2.2 Die CR Logical Unit ..............................................................................................35 2.2.2.3 Load-Store Units ....................................................................................................36 2.2.2.4 Floating Point Units ...............................................................................................36 2.3 Die Pipeline........................................................................................................................37 2.4 Apple G5 System ...............................................................................................................38 LCT Hardware Teil....................................................................................................................40 3.1 Aufgabenbeschreibung.......................................................................................................40 3.2 Die Software ......................................................................................................................40 3.3 Der Simulator.....................................................................................................................40 3.4 Instruction-Format .............................................................................................................44 3.5 Ergebnisse ..........................................................................................................................47 3.6 Optimierung auf Assembler-Ebene....................................................................................49 Literaturliste PowerPC G1-G4, IBM PowerPC 970 und Bildquellen .......................................49 Anhang .......................................................................................................................................51 1 1 Die Geschichte des PowerPC G1-G4 1.1 Das PowerPC - Konsortium Quelle: http://core.de/core/powerpc.html, http://www.fhwedel.de/cis/archiv/seminare/ws9900/ue/PowerPC/PowerPC.html 1991 fanden sich die Firmen Apple, IBM und Motorola in einem, auch AIM genannten, Konsortium zusammen, um einen neuen RISC–Prozessor zu entwickeln der ihren besonderen Ansprüchen genügte. IBM wollte die Entwicklungskosten für ihre neue POWER genannte Architektur senken. POWER (Performance Optimization With Enhanced RISC) wurde mit der RS/6000 in den Markt eingeführt, aber man war an einer Einzelchipversion interessiert und wollte neue Märkte damit erobern. Apple suchten einen Nachfolger für die von Ihnen verwendeten 68000/68040 Prozessoren von Motorola. Der von IBM für deren High-End-Workstations entwickelte POWER-Prozessor war wegen seiner leistungsfähigen und erweiterbaren Architektur ein interessanter Kandidat, jedoch zu teuer in der Herstellung. Motorola brachte in die Entwicklung die Speicherverwaltung- und Cacheeinheit ihrer 88000 RISC-Prozessoren ein (die 88K Familie wurde daraufhin eingestellt). Gleichzeitig mit der Entwicklung der PowerPC-Prozessoren sollte auch eine Referenzplattform geschaffen werden, die zur Konkurrenz gegen die etablierten Intel-Basierten PCs werden sollte. Dabei zeigte sich dann allerdings, dass die Allianz der drei Firmen nicht in allen Belangen einer Meinung war und die eher zurückhaltenden Bemühungen verliefen im Sande. Die Ansprüche an den PowerPC waren umfangreich: Abwärtskompatibilität bis zur Assemblerebene sowohl zum 68000/68040 und zum RS/6000 Preiswert Einfacher Aufbau Hohe Taktraten Load/Store-Architektur Fest definierte Architektur, die sowohl ein 32-Bit wie auch 64-Bit Modell umfaßt Drei-Operanden-Befehle (die Vektor Einheiten (AltiVecTM) ab der G4 Generation beinhalten auch Vier-Operanden-Befehle) Geringe Chipfläche Universelles Konzept für Desktop-, Server- und Embedded–Einsatz (High- und Lowend) Multiprozessorfähig 2 1.2 PowerPC Prozessoren Quelle: u. a. http://www.computer-archiv.de/ Jahr Bezeichnung Generation Hersteller 1992 1994 1994 1994 1994 1994 1995 1995 1996 1996 1996 1997 1997 1998 1998 1999 1999 2001 2002 2003 2003 PPC 601 PPC 601+ PPC 603 PPC 603+ PPC 604 PPC 620 PPC 603e PPC 603ev PPC 604e PPC 613 PPC 614 PPC 750 PPC RS64 PPC AS PPC Nothstar PPC Pulsar PPC 7400 PPC 7450 PPC 7455 PPC 85XX PPC 970 G1 G1 G2 G2 G2 G2 G2 G2 G2 G2 G2 G3 G3 G3 G3 G3 G4 G4+ G4+ G5 G5 Registerbreite / bit L1 Cache / KB Apple / IBM Apple / IBM IBM / Motorola Motorolla Apple / IBM Apple / IBM IBM Apple / IBM Apple / IBM Apple / IBM Apple / IBM IBM / Motorola IBM Apple / IBM IBM IBM IBM / Motorola IBM / Motorola IBM IBM IBM 32 32 32 32 32 / 64 64 32 32 32 32 32 32 64 64 64 64 32 32 32 64 64 32 unbekannt 16 32 unbekannt 32 32 unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt unbekannt 64 Abbildung 1 Auswahl von PPC-Prozessoren im zeitlichen Verlauf Bei einer vollständigen Auflistung aller entwickelten PPC-Prozessoren inklusive etlicher Sonderanfertigungen käme man vermutlich auf einige hundert Prozessoren, wobei sich die Prozessoren einer Generation kaum unterscheiden. Die Varianten besitzen lediglich unterschiedliche Cache- oder Busbreiten. 3 Abbildung 2 Roadmap Motorola 4 Abbildung 3 Roadmap IBM 1.3 G1 anhand des PPC 601 Quelle: http://www-1.ibm.com/servers/eserver/pseries/hardware/whitepapers/power/ppc_601.html 1992 kommt der erste PowerPC, PPC 601 oder auch G1 heraus: Entwickelt in Austin, Texas Basisdesign stammt von RISC Single Chip (RSC) von IBM Basis für die Entwicklung des Businterfaces war der Motorola 88110 In 0,60m - Technologie umgesetzt 32 KB first-level Cache Multiprozessorfähig 33–120 MHz Der PowerPC 601 Mikroprozessor ist ein in hohem Grade integrierter single–chip Prozessor, der eine leistungsfähige RISC Architektur, eine superskalare Maschinen–Organisation und eine vielseitige leistungsstarke Busschnittstelle kombiniert. Der Prozessor enthält 32KB unified Cache und ist zum Dispatchen, zur Ausführung und zum Beenden von bis zu 3 Anweisungen pro Zyklus fähig. Die Businterface Konfiguration versorgt eine breite Palette von Systembusschnittstellen, sowie seriellen und gesplitteten Transaktionen. Das PowerPC - Konsortium hat sich verpflichtet, eine breite Palette von Prozessoren mit der PowerPC Architektur zu unterstützen. Das Projekt 601 hatte einige Schlüsselziele. Zuerst war es wichtig, dass sich die PowerPC Architektur möglichst früh im Markt etablieren kann. Zweitens mußte der Prozessor eine konkurrenzfähige Leistung zu niedrigen Kosten anbieten. 5 Um diese Ziele zu erreichen, stellte sich die Gruppe mit dem 601 Design einem aggressiven 12monatigem Entwicklung Zeitplan. Zur Entwicklung nutzte man Technologien aus, die bei IBM und bei Motorola schon vorhanden waren. Von IBM wurde der RISC Single Chip (RSC) Mikroprozessor für das Basisdesign des 601 verwendet. Der 601 wurde um die superskalare Maschienenorganisation erweitert um größere Performance zu erlangen und es wurden zusätzliche maßgeschneiderte Schaltkreise verwendet um die Größe zu reduzieren und den Betrieb mit höherer Frequenz zu erlauben. Das Motorola 88110 Mikroprozessor-Businterface bildete die Grundlage der Entwicklung des Busdesign der 601 Architektur. Prozessor-Funktionseinheiten Der Mikroprozessor PPC 601 besteht aus den folgenden Units: Instruction–Queue und Dispatch–Queue Branch processing Unit Fixed–Point–Unit Floating–Point–Unit Instruction Fetch Unit Memory–Management–Unit Cache Memory Queue Bus Interface Unit Sequencer Unit Common on–chip processor Unit Abbildung 4 Blockdiagramm PPC 601 Blockdiagramm Wie im Blockdiagramm gezeigt, ist die 601Architektur ein superskalares Design mit drei durch Pipelines geleiteten Durchführungseinheiten. Der Prozessor kann bis zu drei 32-bit Anweisungen pro Zyklus schicken, eine je zur Fixed–Point–Unit (FXU), zur Floating–Point–Unit (FPU) und zur Branch–Unit (BPU). Die übliche „common on – chip processor“ unit (COP) ist die master control logic für den built–in Selbsttest (BIST), Debug-, und andere Test–Features auf dem 601–Chip. Der 6 32KB Einheitscache stellt eine 32-bit Schnittstelle zur FXU, eine 64-bit Schnittstelle zur FPU und eine 256-bit Schnittstelle zur Instruction–queue und zur Memory–queue zur Verfügung. Die Chip I/O beinhalten einen 32-bit Adressbus und einen 64-bit Datenbus. Außerdem unterstützt der Chip eine spezielle asynchrone serielle Schnittstelle, den COP Bus, der erweitertes Debuggen und andere Test–Features liefert. Abbildung 5 Pipeline PPC 601 Pipeline-Beschreibung Die Entwickler optimierten die 601 Struktur mit Pipelines für hohe Leistung und gleichzeitige Abarbeitung der Anweisungen in jeder der Ausführungseinheiten. (Siehe Abbildung 5). Im allgemeinen dient die FXU als Masterpipeline, und synchronisiert die Steuerung, die erforderlich ist, um exakte Ausnahmen zu erzielen. Die Fixedpoint Pipeline führt alle Ganzzahl- alle Arithmetisch-Logischen Operationen (ALU) und alle Prozessor–Load- und Storeanweisungen, einschließlich der Gleitkomma–Load – und Storeoperationen durch. In einigen Fällen können Gleitkomma–Load- und Storeoperationen auch durch die Gleitkommapipeline geleitet werden. Die Hardware behandelt alle Hazards und Abhängigkeiten. Die Weiterleitungslogik ermöglicht es, die Integer–ALU gepipelined zu betreiben. Es kostet einen Zyklus, die Abhängigkeiten nach dem Laden zu bearbeiten. 7 Abbildung 6 Instruction Queue und Dispatch PPC601 Die Branchpipeline hat nur zwei Stufen. Die erste Stufe kann dispatchen, decodieren, auswerten und wenn notwendig die Sprungadresse eines Verzweigungsbefehls in einem Zyklus voraussagen. Im folgenden Zyklus kann der resultierende Fetch auf die Anweisungen im Cache zugreifen. Dieses erlaubt dem Prozessor, auf Sprunganweisungen schnell zu reagieren, und so die Latenzzeit für weitere Anweisungen zu vermindern. Die Floating - Point–instruction–Pipeline enthält sechs Stufen und ist für Pipelining von single– precision–Operationen optimiert worden. Obwohl die Hardware alle double–precision–Operationen unterstützt und die meisten von ihnen in Pipelining ausgeführt werden, müssen jene welche Multiplikationen beinhalten doppelt durch die Stufen Execute1 und Execute2 der Pipeline geführt werden. 8 1.4 G2 anhand des PPC 604 Quelle: Advance Information PowerPC 604 RISC Microprocessor Technical Summary (IBM / Motorola) • • • • • • • • • • • • • • • 1994 kommt der PowerPC 604 (G2) raus: Superskalare Architektur mit sechs Pipelines Aus der Fixed-Point Unit des PPC601 werden Drei Integer Units, nämlich o Zwei Single-Cycle Integer Units (SCIUs) o Eine Multiple-Cycle Integer Unit (MCIU) Floating-Point Unit (FPU) Branch Processing Unit (BPU) Load / Store Unit (LSU) Rename Buffers, 12 GPR Rename Buffers und 8 FPR Rename Buffers Aus der MMU des PPC601 werden zwei, nämlich o Data MMU o Instruction MMU Die Branch Processing Unit bietet jetzt eine dynamische Sprungvorhersage und die spekulative Ausführung von zwei Sprüngen. 512-entry branch history table mit jeweils Zwei-Bit Predictor 64-entry Branch Target Address Cache mit 32-bit Adressen (logisch) Integer von 8, 16 und 32 bit (single- und doubleprecision) Floating-Point Daten von 32 und 64 bit (singleprecision) In 0,25 micron CMOS–Technologie hergestellt Bis zu 350 MHz getaktet Abbildung 7 Beispielspezifikation 9 Prozessor-Funktionseinheiten Der Mikroprozessor PPC 604 besteht aus den folgenden Units: • • • • • • • • • • Instruction Unit o Fetch o Branch–Processing Unit o Instruction Queue (8 word) o Dispatch - Unit Memory - Management Units o Instruction MMU o Data MMU Multi - Cycle Integer Unit 2 x Single–Cycle - Integer Unit Floating - Point Unit Register o 32 General Purpose Registers (GPRs)–File (12 rename register) o 32 Floating–Point Registers (FPRs) – File (8 rename register) Condition Register (CR) – File (8 rename register) Load / Store Unit Completion Unit Bus Interface Unit Abbildung 8 Blockschaltbild PPC 604 Legende: BTAC: Branch Target Adress Cache SR: Segment Register 10 Der 604 Prozessor implementiert die PowerPC–Architektur, wie sie für 32 bit Adressen spezifiziert ist. So werden 32 bit logische Adressen, Integer–Daten aus 8, 16 und 32 bit und Floating–Point– Daten mit 32 und 64 bit (single und double precision) unterstützt. Für 64–bit–Anwendungen unterstützt die Architektur auch 64 bit Integer–Daten und 64 bit Adressen. Der PPC 604 ist ein Superskalarer Prozessor der in der Lage ist vier Instruktionen simultan auszugeben. Im Idealfall können bis zu sechs Instruktionen parallel ausgeführt werden. Die sechs parallelen Pipelines laufen über folgende Ausführungseinheiten: • Floating–Point–Unit (FPU) • Branch–Processing–Unit (BPU) • Load / Store Unit (LSU) • Drei Integer–Units (IUs): o Zwei Single–Cycle–Integer Units (SCIUs) o Ein Multiple–Cycle Integer Unit (MCIU) Dieses parallele Design kombiniert mit der PowerPC–Spezifikation mit einheitlichen Instruktionen erlaubt eine schnelle Ausführungszeit und erzeugt so einen hohen Durchsatz. Der PPC 604 hat separate Memory–Management–Units (MMUs) und teilt den on–chip Cache in Daten und Instruktionen. Er hat zwei 128 Einträge fassenden, Zwei–Wege - Associative– Translation–Lookaside Buffer (TLBs) (jeweils 64 Einträge), einen für Instruktionen und einen für Daten. Sowohl der Cache wie auch der TLB benutzen den Least–Recently–Used–Algorithmus. Abbildung 9 Blockdiagramm der internen Datenpfade Der 604 hat einen externen 72 bit Datenbus (64-bit Daten und 8-bit parity) und einen 36 bit Adressbus (32-bit Daten und 4-bit parity). Das Interface–Protokoll erlaubt den Multimasterbetrieb. Der Bus kann in Systemen mit verschiedenen Buszuteilungstaktiken eingesetzt werden. 11 1.4.1 Instruction Flow Verschiedene Einheiten auf dem 604 garantieren den einwandfreien Fluß von Instruktionen und Operanden. • Fetch–Unit: Benutzt die nächste sequenzielle Adresse oder die Adresse, die die BPU liefert, wenn ein Sprung möglich oder sicher ist. Die Fetch–Unit liefert die Instruktionen in einen Acht–Wort–Instruction–Buffer. • Decode / Dispatch Unit: Die Decode / Dispatch Unit dekodiert Instruktionen und verteilt sie zu den entsprechenden Ausführungseinheiten. Während des Dispatchens werden die Operanden von den Registern zur Ausführungseinheit geliefert. • Branch Processing Unit (BPU): Außer die Fetch–Unit mit vorausgesagten Sprungzielen zu beliefern, wenn ein Sprung vorausgesagt wurde, führt die Unit alle Condition–Register– Logical und Flow–Control–Instruction durch. • Instruction Completion Unit: Die Completion–Unit beendet ausgeführte Instruktionen in der Programmreihenfolge und überwacht die Aktualisierung des Maschinenstatus. 12 1.5 G3 anhand des PPC 750 Quelle: Advance Information PowerPC 750 RISC Microprocessor Technical Summary (IBM / Motorola) • • 1997 kommt der PowerPC 750 (G3) raus: Superskalare Architektur mit sechs Pipelines nämlich: o Zwei Integer-Units o System–Register–Unit Führt verschiedene Systemlevel Instruktionen aus sowie logische Registeroperationen. Ausserdem move to/from aus Spezialregistern • Floating-Point Unit (FPU) • Store Queue • Branch processing Unit (BPU) • Load / Store Unit (LSU) • Level 2 Cache Bus Interface mit Controller • Zwei-Wege Set-Assoziativer L2 Cache • Externer Daten-SRAM • Support für 256 KB, 512 KB und 1 MB L2 Cache • bis 400MHz getaktet Prozessor-Funktionseinheiten Der Mikroprozessor PPC750 besteht aus den folgenden Units: • • • • • • • • • • Instruction Unit o Fetcher o Branch–Processing Unit o Instruction Queue (6 word) o Dispatch - Unit o Branch processing Unit 0 Memory - Management Units o Instruction MMU o Data MMU Zwei Integer Units o Integer Unit 1, kann alle Integer–Instruktionen ausführen o Integer Unit 2, kann nur addieren und subtrahieren System Register Unit Register o General Purpose Registers (GPRs)–File (12 rename buffers) o Floating–Point Registers (FPRs) - File (8 rename buffers) Load / Store Unit Floating - Point Unit Completion Unit 60x Bus Interface Unit für Level 1 cache interface Neu ist die separate Businterface Unit mit Controller für den Level 2 cache 13 Abbildung 1 Blockschaltbild PPC 750 Abbildung 10 Blockschaltbild PPC 750 Die Möglichkeit, verschiedene Instruktionen parallel auszuführen ergibt eine hohe Effektivität und einen hohen Durchsatz für die auf dem PPC 750 basierenden Systeme. Die meisten Integer– Instruktionen können innerhalb eines Zyklus ausgeführt werden. Die FPU ist gepipelined, die Tasks, die sie ausführt werden zerteilt in Subtasks. Implementiert wurde dies in drei aufeinander folgenden Stufen. Normalerweise belegt eine Floating–Point–Instruktion immer nur eine der drei Stufen. Diese wird nach dem Zyklus für die nächste Floating–Point–Instruktion frei. So können sich gleichzeitig drei Single–Precision–Floating–Point–Instruktions in der FPU befinden. Double– Precision–Additions–Instruktionen haben eine Latenzzeit von drei Zyklen und Double–Precision– Multiplikationen (mit und ohne Addition) haben eine Latenzzeit von vier Zyklen. Das Blockschaltbild zeigt die parallele Organisation der Ausführungseinheiten. Der PPC 750 hat zwei voneinander unabhängige, on–chip, 32 KB, acht–Wege, setassoziativen und physikalisch adressierbaren Caches, einen für Instruktionen und einen für Daten und außerdem unabhängige Instruktions- und Daten- Memory–Management–Units (MMUs). Jede MMU kann 128 Einträge fassen, sie hat einen zwei–Wege, setassoziativen TLB (DTLB und ITLB), welcher die Übersetzungen der letzten verwendeten Speicheradressen enthält. Der L2 Cache ist mit einem Zwei–Wege, setassoziativen Tag–Memory und mit externem, synchronem SRAM für die Datenhaltung ausgestattet. Der externe SRAM ist verbunden mit einem geeigneten L2–Cache–Port verbunden der eine Bank mit bis zu 1 MB synchronem SRAM unterstützt. 14 1.6 G4 anhand des MPC 7400 Quelle: Advance Information MPC 7400 RISC Microprocessor Hardware Specifications (Motorola) 1999 der PowerPC 7400 (G4) kommt heraus. Superskalare Architektur mit acht Pipelines, nämlich: • Zwei Integer-Units • System Register Unit • Floating-Point Unit (FPU) • Branch processing Unit (BPU) • Load / Store Unit (LSU) • Vector Unit • Vector Permute Unit • Vector ALU o Vector Simple Integer Unit o Vector Complex Integer Unit o Vector Floating Point Unit Abbildung 11 Blockschaltbild MPC 7400 Das eigentlich neue in dieser Generation von PowerPCs ist die nun unabhängigen Vektor– Verarbeitung AltiVecTM sowie die Implementierung des Instruktionssatz. Hiermit soll eine bessere Grafikfähigkeit erreicht werden. Der PPC 7400 hat signifikante Verbesserungen der Memory–Subsystem (MSS) Bandbreite erfahren und bietet optional ein MPX Buserweiterung zum 60x Prozessorinterface mit einer hohen Bandbreite. 15 Die Floating–Point–Unit hat jetzt die gleiche Latenzzeit für Single- und Doubleprecision Operationen einschließlich Multiplikationen. Die Completion Queue wurde auf acht Slots erweitert. Es gab jedoch keine signifikanten Änderungen an den skalaren Pipelines und das vierstufige Pipelinemodel des PPC 750 ist unverändert übernommen worden. 1.7 Der G5 Quelle: Power Mac G5 Technology and Performance Overview (Apple) Abbildung 12 Blockschaltbild G5 2003 kam die fünfte Generation des PowerPC heraus.Die superskalare Architektur ist hier auf 10 Pipelines angewachsen. Sowohl eine Floating–Point–Unit wie auch eine Load / Store Ausführungseinheit kam hinzu. 16 2 Der PowerPC 970 Prozessor Der PowerPC 970 wurde für Desktop-PCs und für kleinere Serversysteme entwickelt. Der Kern des PowerPC 970 Prozessors basiert auf dem des Power4 Prozessors. Der Power4 Prozessor ist für den high end Server-Markt entwickelt worden. Der 970 Prozessor ist der bisher schnellste PowerPC-Prozessor. Der Chip ist als erster in einer neuen Familie von High-End PowerPC-Prozessoren für Geschwindigkeiten bis 2.0 GHz entwickelt. Er besitzt eine Single Instruction Multiple Data Einheit (SIMD, als „Velocity Engine" bei Apple bezeichnet) und ist in der Lage, Daten in 64-Bit-Abschnitten zu verarbeiten und rechenintensive Anwendungen wie Multimedia und Grafik zu beschleunigen. Er besitzt eine 1 GHz-Kommunikationsverbindung (Bus) zur Beschleunigung des Datenaustausches zwischen Prozessor und Hauptspeicher-Controller. Der Bus hat eine Spitzenbandbreite von 8 GB/s (Gigabyte pro Sekunde) und kann somit hohe Datenmengen an den Prozessor liefern. Die Bandbreite der 1 GHz-Kommunikationsverbindung zwischen Prozessor und HauptspeicherController ist groß genug, um z.B. die Daten von einem durchschnittlichen Spielfilm in weniger als zwei Sekunden vom Hauptspeicher an den Prozessor zu befördern. Das Bussystem, auf das später eingegangen wird, wurde exklusiv für Apple entwickelt. Natürlich unterstützt der PowerPC 970–Prozessor nicht nur 64-bit-Computing für neue Anwendungen, sondern auch traditionelle 32-bit-Anwendungen. Das Design unterstützt symmetrisches Multi-Prozessing (SMP). Dies ermöglicht es, Systeme mit multiplen Prozessoren zu bauen, die im Verbund und damit mit erheblich mehr Gesamtprozessorleistung arbeiten. Geplant ist die Produktion des G5-Chip in IBMs neuer 300 mm-Wafer-Chip-Fabrik im Staat New York. Dabei kommt eine ultradünne 0,13-Micro-Verdrahtung (fast 800x dünner als menschliches Haar) zum Einsatz. Der Chip enthält fast eine Viertel-Meile (ca. 400 m) Kupfer-Verdrahtung und ca. 59 Millionen Transistoren auf Basis der IBM Silicon-on-Insulator-Technologie (SOI). Durch den Einsatz der SOI-Technologie, bei der eine vergrabene Isolationsschicht unter der Siliziumoberfläche die elektrischen Eigenschaften integrierter Schaltungen verbessert, siehe Abbildung unten, verspricht sich IBM schnellere und sparsamere Chips. Quelle: IBM Die 'Silicon-On-Insulator'-Technologie vermindert Effekte, die durch interne parasitäre Kapazitäten und Transistoren im Silizium entstehen, die die weitere Verkleinerung von integrierten Schaltungen erschweren. Kleinere Strukturen machen Chips nicht nur schneller, weil Signalwege verkürzt werden, sondern benötigen auch weniger Ansteuerspannung und damit weniger Leistung. Mit der durch die SOI-Technologie geringeren kapazitiven Einflüsse ließen sich, laut IBM, SOIChips bei gleicher Leistungsaufnahme mit bis zu 35 Prozent höheren Frequenzen betreiben. Die Verlustleistung würde damit um den Faktor 1,7 bis 3 gesenkt. Vor allem portable Geräte aller Art können davon profitieren. SOI ist nichts wirklich Neues, zumal seit mehr als 30 Jahren an der 17 Herstellung einkristalliner SOI-Schaltungen geforscht wird. Bahnbrechend ist jedoch die wirtschaftliche Herstellung der bislang nur für teure Spezialanwendungen genutzten Technologie. IBM verspricht sich einen SOI-Vorsprung von ein bis zwei Jahren gegenüber anderen Halbleiterherstellern. Obwohl die Produktionskosten des PowerPC 970 niedriger als die des Power4 Prozessors sind und er auch günstiger zu erwerben ist, übersteigt dessen Performance die des Power4 Prozessors in vielen Gebieten. In punkto Zuverlässigkeit jedoch kann der PowerPC 970 Prozessor jedoch nicht mit dem Power4 Prozessor konkurrieren. Der PowerPC 970 Prozessor ist, im Vergleich zum Power4 Prozessor, für eine höhere Leistung auf Kosten der Zuverlässigkeit ausgelegt. Die höhere Zuverlässigkeit beim Power4-Prozessor begründet sich unter anderem auf dem Einsatz der ECCSpeichertechnologie (Error Checking Correction). Auf diese Technologie, die zur Optimierung der Zuverlässigkeit und Fehlerbehebung von L2- und L3-Cache-Speicher sowie des Hauptspeichers eingesetzt wird, und die Vielzahl der anderen im Serverbereich eingesetzten Technologien, wird an dieser Stelle jedoch nicht weiter eingegangen. Der PowerPC 970-Prozessor entstammt der bewährten und weit unterstützten Architektur des Power4 Prozessors und enthält dadurch einen für hohe Durchsätze geeigneten I/O-Prozessor, 512 Kilobyte L2-Cache und Verfügbarkeitsmerkmale wie Error Correction Code ECC (automatische Korrektur von fehlerhaft übertragenen Bits), die aus der Serverwelt stammen. Das folgend dargestellte Blockdiagramm zeigt den Vergleich zwischen PowerPC 970 Prozessor und Power4 Prozessor in groben Zügen: Quelle: arstechnica.com Die farblichen Markierungen zeigen, welche Komponeten des PowerPC 970 Prozessors der Architektur des Power4 Prozessors entstammen. Hier wird deutlich, dass ein CPU Kern von dem Dual-CPU-Kern des Power4 Prozessors entfernt wurde. Die Größe des L2-Cache ist auf 512 KB reduziert und wurde für die Verbindung zum einzelnen Kern optimiert. Ebenfalls wurde eine SIMD Vektor AltiVec Einheit hinzugefügt. 2.1 Die AltiVec-Erweiterung Die AltiVec-Einheit stellt, ähnlich wie Intels MMX-Erweiterung für die Pentium-Reihe, eine Multimedia-Erweiterung speziell für den PowerPC dar. Dabei handelt es sich, wie bei MMX, um eine Vektorrecheneinheit. Zusätzlich zu den typischen Anwendungen wie Grafik und Multimedia ist AltiVec, im Gegensatz zu MMX, aber auch auf die Verarbeitung von IP-Telefonie-, Spracherkennungs- und Netzwerk-Diensten ausgelegt. Das Haupteinsatzgebiet der PowerPCProzessoren liegt bei Multimediaanwendungen und kleineren (speziell Kommunikations-) Servern. Deshalb ist auch die AltiVec-Erweiterung auf Bild-, Video- und Sprachverarbeitung ausgelegt. Wie man im Vergleich der folgend dargestellten Prozessor-Dies des G3- und G4-Prozessors erkennen kann, hat die AltiVec-Erweiterung im G4-Prozessor einen hohen Stellenwert. 18 G3-Die Quelle: realworldtech.com G4-Die Wie in der Grafik des G4-Die zu erkennen ist, ist das gesamte obere Viertel des G4-Dies von der Vektorrecheneinheit eingenommen. Da die Ausnutzung der Fläche des Dies einer der wesentlichen Kostenfaktoren eines Prozessors ist, wird hier deutlich, dass Motorola der neuen Vektorrecheneinheit eine sehr große Bedeutung zumisst. Die AltiVec-Erweiterung führt maximal 16 Befehle „parallel“ aus, d.h. ein Vektor besteht aus maximal 16 Elementen. Die AltiVec-Einheit bildet, gleichwertig zu den anderen Einheiten, eine unabhängige Ausführungseinheit. Sie besteht intern weiterhin aus wiederum 2 voneinander unabhängigen Einheiten, einer Vektor-ALU und einer zweiten Einheit, die für Permutationen zuständig ist. Die AltiVec Einheit verarbeitet 128 Bit-Vektoren und besitzt 32 eigene 128-Bit Register und einen ebenso breiten Bus zum Hauptspeicher. Mit einem Load-Befehl wird ein kompletter Vektor in ein Register geladen. Für den Einsatz der neuen Vektoreinheit stehen 162 neue Befehle zur Verfügung. Dabei bezieht sich ein Befehl auf maximal 3 Quell- und ein Zielregister. Die AltiVec-Einheit bietet neben den erwarteten algorithmischen Befehlen auch komplexere Befehle an, die häufig verwendete Rechenschritte zu einem einzigen Befehl zusammenfassen. Das erkennt man an dem im Vergleich zu „herkömmlichen“ Assemblerbefehlen zusätzlichen Quellregister (3 statt 2). Die 128-Bit Register können in 16x8-Bit-, 8x16-Bit- oder 4x32-Bit-Elemente aufgeteilt werden. So kann man z.B. acht 16 Bit Integer zu acht weiteren 16 Bit Integer addieren um acht 16 Bit Ergebnisse zu erhalten, was durch eine einzige „vector add“ Instruktion passiert. Die AltiVec Einheit unterstützt 8 Bit, 16 Bit und 32 Bit Integer Operationen genauso wie 32 Bit floating point Operationen. Die folgende Grafik zeigt die Möglichkeiten zur Unterteilung der Elemente. 19 Quelle:realworldtech.com Die AltiVec Einheit stellt also eine SIMD Vektor Einheit dar, weil sie auf mehreren Elementen in einem Vektorregister mit nur einer SIMD-Instruktion arbeitet. Beispielweise seien die beiden arrays A und B gegeben: A 1 2 3 4 5 6 7 8 B 80 70 60 50 40 30 20 10 Wenn diese beiden Register nun addiert werden sollen, werden sie beide jeweils in ein Vektor Register geladen und eine SIMD Vektor Instruktion liefert dann das Ergebnis: 81 72 63 54 45 36 27 18 Der folgend dargestellte und aus dem Handbuch des PowerPC 970 Prozessor entnommene VektorBefehl zeigt die Addition von zwei 4x32-Bit Vektoren. 20 Quelle: IBM Für AltiVec-Befehle gibt es die Befehlsformate VA-Form, VX-Form, VXR-Form und X-Form, die auf den folgenden Seiten, anhand von Ausschnitten aus der Spezifikation der Befehle, dargestellt werden. Die Bits 21-31 stellen bei dem hier am Beispiel des Befehls vaddfp dargestellten VX21 Format, das erweiterte Opcode Feld dar (Extended Opcode Field). VSCRN ist das Vector-Statusund-Control-Register. Es besitzt zwei definierte Bits, das AltiVec non-Java-Mode(NJ)-Bit (VSCR[15]) und das AltiVec-Saturation-(SAT)-Bit (VSCR[31]). Das Non-Java-Mode-Control-Bit bestimmt, ob AltiVec Floating-Point Operationen im Java-IEEE-C9X-fähigen-Mode ausgeführt werden oder möglicherweise in einem schnelleren non-Java/non-IEEE-Mode ausgeführt werden. Ist das Non-Java-Mode-Control-Bit auf 0 gesetzt, so ist der Java-IEEE-C9X-fähigen-Mode gewählt. Ist es auf 1 gesetzt, so ist der non-Java/non-IEEE-fähigen-Mode gewählt. Dieser Mode ist unter Umständen dann sinnvoll, wenn Real-Time-Performance wichtiger ist, als sich streng an den Java und IEEE-Standard zu halten. Das AltiVec-Saturation-Bit wird für Saturation(Überlauf)-Detection benutzt. Saturation tritt dann auf, wenn das Ergebnis einer Saturation-Operation nicht in das Ergebnisfeld passt. Quelle: IBM 22 Quelle: IBM 23 Quelle: IBM 24 Quelle: IBM Die Altivec SIMD Einheit wurde von IBM und Motorola gemeinsam entwickelt. Motorola hat aber die Rechte für den Namen „Altivec“. Deshalb taucht diese Bezeichnung nicht im Blockdiagramm mit auf. 25 Die AltiVec Vektor Einheit bearbeitet also gleichzeitig 128-Bit Operanden. Sie besteht aus der: - Vector Permute Unit (VPU) für Operationen wie pack, unpack, merge. Um z.B. ein Register mit den Bytes von 2 anderen Registern zu füllen. Vector Arithmetic Logic Unit (VALU) o Vector Simple Integer Unit (VSIU) für Vektorinstruktionen mit kurzer Latenz wie Addition, Subtraktion, Vergleichs- und Bit-Schiebebefehle. o Vector Complex Integer Unit (VCIU) für Instruktionen mit langer Latenz wie Befehle, die eine Multiplikation enthalten oder Summen über die Elemente eines einzelnen Vektors bilden. o Vector Floating-Point Unit (VFPU) zur Bearbeitung von Fliesskommabefehlen. Die Permutationseinheit wird eingesetzt, um die Elemente innerhalb der Vektoren anzuordnen. Wurde etwa in einem Vektor, der 16 Elemente enthält, für je vier benachbarte Elemente das Minimum bestimmt, so entsteht ein Ergebnisvektor, der nur an vier Positionen brauchbare Daten enthält (die vier Minima), die restlichen 4x3 Felder sind leer. Wurde diese Operation auf 4 Vektoren ausgeführt, so lassen sich die 4x4 Ergebnisse zu einem neuen Vektor zusammenfügen, um damit weiterzurechnen. Beispiele für den Einsatz der AltiVec-Erweiterung Als erstes Beispiel sei an dieser Stelle die Berechnung des Skalarproduktes von 16-elementigen Vektoren angeführt. Dabei werden die Vektoren komponentenweise miteinander multipliziert, die Produkte werden aufsummiert. In die Summe kann zusätzlich der Ergebnisvektor einer vorhergehenden Berechnung mit einfließen. Der gesamte Vorgang umfasst mit dem G3-PowerPCProzessor ohne AltiVec-Erweiterung 36 Befehle, die sich nun auf nur 2 AltiVec-Befehle reduzieren. Ein weiteres Beispiel ist die Einsparung ganzer Kontrollflusssequenzen. Die Sequenz for (i=0; i<16; i++) { if(a[i]==b[i]) r[i]=x[i]; else r[i]=y[i]; } //16 8-Bit-Elemente //Vergleich der Elemente zweier Vektoren //x: erste Quelle //y: alternative Quelle //r: Ergebnis lässt sich z.B. durch zwei Vektor-Befehle ausdrücken. Dabei werden zuerst die beiden Vektoren a und b miteinander verglichen und eine Ergebnismaske berechnet, die an der Stelle i eine 0 enthält, wenn die beiden Elemente a[i] und b[i] unterschiedlich waren, sonst den Wert FF. Dann wird mit dem vsel-Befehl (Vektor select), siehe Abbildung unten, der Ergebnisvektor abhängig von der berechneten Maske aus den beiden Quellvektoren x und y zusammengestellt (Permutationseinheit). Dadurch wird eine vorher 48 Befehle lange Sequenz auf 2 Vektor-Befehle reduziert. 26 Quelle: IBM Pro Taktzyklus können zwei neue AltiVec Operationen gestartet werden. Im Vergleich zur Altivec Implementation des PowerPC G4, besitzt die des 970 Prozessors eine zusätzliche „Vector Issue Queues Einheit. 27 Quelle: arstechnica.com Der PowerPC 970 Prozessor kann 4 Vektor Operationen per Zyklus zu den zwei Vector Issue Queues weiterleiten, der G4 nur 3. Die linke VPU Vector Issue Queue kann 16, die rechte VALU Queue kann 20 Einträge beinhalten. Von diesen 2 Queues kann dann pro Zyklus jeweils eine beliebige Vektor Operation an die angebundene(n) Einheit(en) weitergeben werden. Wie man auch in der Abbildung erkennen kann, können der G4e und der 970 Prozessor pro Zyklus die selbe Anzahl an Vektor Operationen an ihre angebundenen Altivec Einheiten liefern. Der 970 Prozessor ist in der Kombination der Operationen eingeschränkt, weil einer der 2 Ops eine „vector permute“ sein muss. Ein direkter Vorteil ist aus der umstrukturierten AltiVec Einheit nicht zu erkennen. Sie ist lediglich an den Prozessor-Kern des Power4-Prozessors und damit an den des PowerPC 970 angepasst worden. 2.2 Die Architektur des 970 Prozessors Die Architektur des PowerPC 970-Prozessors lässt sich mit der folgenden Grafik darstellen: 28 Quelle: arstechnica.com Wegen der Tiefe der Pipeline und der Breite des Ausführungskerns spendierten die Designer einen beträchtlichen Block der Chip-Ressourcen der Sprungvorhersage. Damit die Pipeline ständig gefüllt ist und der großflächige Ausführungsbereich ständig benutzt wird, ist eine genaue Sprungvorhersage essentiell. Der PowerPC 970 hat mehr Ressourcen für die Sprungvorhersage als der P4 und sein Vorgänger, der G4e, zusammen. Er hat, für jeden Sprung, auf den er stößt, für die Sprungvorhersage zwei unterschiedliche Konzepte zur Verfügung. Für jeden Sprung wird dann das am besten geeignete Konzept der Sprungvorhersage ausgewählt. 2.2.1 Front End Quelle: arstechnica.com 29 Im Front End Bereich werden 8 Instruktionen pro Zyklus aus dem L1-Cache in die Instruction Queue geholt. Die Branch Prediction Unit durchsucht dabei die im fetch-Vorgang geholten acht Instruktionen nach branches, um Sprungvorhersagen zu treffen. Dabei können maximal zwei braches ermittelt werden. Ist eine der zwei branches ein bedingter Sprung, dann liefert die branch prediction unit eine Vorhersage des bedingten Ergebnisses (taken or not taken) und/ oder die ZielAdresse durch die Nutzung eines der beiden branch prediction-Konzepte. 2.2.1.1Branch prediction Konzepte Das erste branch predicition Konzept, das vom PowerPC 970 verwendet wird, ist das Standard Konzept, das auf der branch history-Tabelle basiert und beim P4 und G4 zum Einsatz kommt. Beim Power4 und 970 Prozessor wird hier hingegen von „local predictor“ gesprochen. Dieses Konzept arbeitet mit 16K Einträgen, viermal so viele Einträge wie z.B. beim P4. Für jeden dieser 16K Einträge gibt es ein 1-bit Flag das aussagt, ob der Sprung gemacht werden soll oder nicht. Das zweite Konzept beinhaltet eine weitere Tabelle mit 16K Einträgen, die global predictor – Tabelle. Jeder Eintrag in dieser Tabelle ist assoziiert mit einem 11-bit Vektor (global history vector), der den aktuellen Ausführungsverlauf der letzten 11 fetch-Gruppen (a 8 Instruktionen) aufnimmt. Jedes Bit in dem global history vector bestimmt, ob die nächste fetch-Gruppe aus dem sequentiell folgenden Cache-Sektor geholt wird oder nicht. Im Fall eines notwendigen nichtsequentiellen Holens von fetch-Gruppen aus dem Cache, wird der global history vector korrigiert. Der global history vector ist, unter Verwendung eines Bit-weisen Exklusiv-Oder oder der Adresse der branch-Instruktion, gehashed. Das Ergebnis indiziert die global predictor table, um dort das 1-bit Flag für die Vorhersage zu setzen. Schließlich gibt es noch eine dritte Tabelle mit 16K Einträgen, die in den Front-End Block involviert ist und entscheidet, welches von den zwei branch prediction-Konzepten am besten für jeden einzelnen Sprung geeignet ist. Dabei vergleicht der Prozessor die Erfolgsaussichten der beiden branch prediction-Konzepte und hält dann in der dritten Tabelle, namens selector table fest, welches Konzept am besten für den jeweiligen Sprung geeignet ist. Die selector table ist genauso indiziert, wie die global predictor table. Die genaue Funktionsweise der selector table wird von IBM leider nicht preisgegeben. Dieses branch-prediction-Konzept wurde vom Power4 Prozessor übernommen. 2.2.1.2Decode, cracking und group formation Der IBM PowerPC 970 holt sich acht Instruktionen pro Zyklus aus dem L1-Cache in die Instruction Queue . Von dort aus werden pro Zyklus acht Instruktionen zur Dekodierung geholt. Sein Vorgänger, der G4e, konnte nur vier Instruktionen pro Zyklus holen und dekodieren. Im Vergleich zum PowerPC 970 Prozessor holt der P4 nur eine x86 Instruktion pro Zyklus. Der P4 besitzt aber auch den Trace Cache, siehe Abbildung auf der nächsten Seite. Der Trace-Cache speichert Sequenzen von Micro-Operationen aus dem dynamischen Instruktionsstrom. Um Sprünge zu optimieren, besitzt er eine unabhängige Sprungvorhersageeinheit auf Mikro-Operation Basis. Komplexe x86-Instruktionen bestehen oft aus vielen Mikro-Operationen. Deshalb speichert der Trace-Cache nur die jeweils erste Mikro-Operation solcher Instruktionen ab. 30 Trace-Cache beim Pentium 4 Quelle: Intel.com Die fetch und decode Phasen des P4 und des PowerPC 970 sind aber in einem wichtigen Punkt gleich. Beide Prozessoren brechen die im ISA Format (Instruction Set Architecture) vorhandenen Instruktionen in ein kleineres Format, das im Inneren der CPU verarbeitet wird, herunter. Der P4 bricht jede x86 CISC Instruktion in kleinere Mikro-Operationen herunter, wobei die meisten dieser Instruktionen in 2 oder 3 Mikro-Operationen heruntergebrochen werden. Komplexere oder selten benutzte Instruktionen werden in viele Mikro-Operationen heruntergebrochen. Der PowerPC 970 bricht die Instruktionen in sogenannte „IOPs“, „internal operations“, herunter. Wie die Mikro-Operationen des P4 werden auch die IOPs des PowerPC 970 Prozessors in beliebiger Reihenfolge von der Ausführungseinheit (Execution Core) ausgeführt. Bis auf wenige Ausnahmen werden fast alle ISA Instruktionen des PowerPC genau in eine IOP übersetzt. Für die Instruktionen, die in mehr als eine IOP übersetzt werden, unterscheidet IBM zwischen - Einer „cracked instruction“, eine Instruktion, die in genau zwei IOP aufgeteilt wird. Einer „millicoded instruction“, eine Instruktion, die in mehr als zwei IOPs aufgeteilt wird. Beispiele für das Herunterbrechen in „IOPS“ werden von IBM nicht angegeben, so das dieser Vorgang spekulativ ist. Diese Art, in der Instruktionen klassifiziert werden, ist nicht willkürlich gewählt. Vielmehr ist dies in einer sehr wichtigen Entscheidung über das Design festgelegt worden, die ursprünglich von den Designern des Power4 Prozessors gemacht wurde in Bezug darauf, wie der Chip mit Instruktionen in verschiedenen Ausführungsphasen umgeht. Dies soll anhand der folgenden Teil-Grafik und den folgenden Erläuterungen erklärt werden: 31 Quelle: arstechnica.com Bei Betrachtung dieser Grafik der Gesamtarchitektur (Die Architektur des 970 Prozessors) wird deutlich, dass nach der „decode, cracking and group formation“ Phase im Front End fünf Kästen folgen. Diese fünf Kästen werden von IBM als „group“ bezeichnet. Jede Gruppe oder „group“ besteht aus fünf IOPs, wie in der Programmreihenfolge durch feststehende Regeln und Beschränkungen festgelegt ist. Es sind eben diese organisierten Gruppen von fünf IOPs und nicht einzelne IOPs, die der PowerPC 970 in dieser Reihenfolge an die 6 „Issue Queues“ und damit an die Ausführungseinheit (Execution Core) schickt. Haben die IOPs, die sich ja in einer Gruppe befinden, ihre zugehörige „Issue Queue“ erreicht, können sie in beliebiger Reihenfolge den Ausführungseinheiten zugeteilt werden, wobei 8 IOPs pro Zyklus für alle Queues insgesamt zugeteilt werden können. Bevor sie aber die Abschlussphase (completion stage“) erreichen, müssen sie zurück in ihre Gruppenformation gebracht werden, so dass eine gesamte Gruppe von 5 IOPs in einem Zyklus abgearbeitet werden kann. Der PowerPC 970 bringt also immer Gruppen von IOPs zur Ausführung. So werden, anstelle von z.B. 100 einzelnen IOPs nacheinander, 20 Gruppen à 5 IOPs ausgeführt. Durch diese Gruppenbildung wird der Overhead in bezug auf Zuteilung und Umordnen des sehr großen Volumens an Instruktionen reduziert, indem man das „tiefe und breite“ Design des PowerPC 970 Prozessors ausnutzt. Der Preis für die so erreichte Reduzierung des Overheads ist ein Verlust an Effizienz bei der Ausführung, verursacht durch die eingeschränkte Möglichkeit individuelle Instruktionen einplanen und zuteilen zu können, was im folgenden erklärt werden soll. Wenn die Front End Einheit des PowerPC 970 eine IOP-Gruppe zusammenbaut, gibt es festgelegte Regeln, die befolgt werden müssen. Die erste Regel besagt, dass die fünf in der IOP-Gruppe verfügbaren Plätze durch IOPs in Programmreihenfolge belegt werden müssen, angefangen mit der ältesten IOP an der ersten Stelle (Platz 0), bis hin zur neusten IOP an der 5ten Stelle (Platz 4). Eine weitere Regel besagt, dass alle branch Instruktionen an die 5te Stelle (Platz 4) kommen und somit der letzte Platz in der Gruppe für eine branch Instruktion reserviert ist. Wenn aber nun vom Front End keine branch Instruktion gefunden werden konnte, die an die letzte Stelle in der IOP-Gruppe gehört, dann können eben nur 4 Instruktionen in diesem Zyklus weitergegeben werden. Es gibt weitere Situationen, in denen die Front End Einheit für bestimmte IOPs vorgesehene Plätze mit noops belegen muss, um die Belegung des letzten Platzes in der IOP-Gruppe mit einer branch Instruktion zu erzwingen. Anders ausgedrückt muss also die Front End Einheit manchmal IOP-Plätze in der Gruppe und damit im Instruktionsfluss unbelegt lassen, um die schon beschriebenen Regeln, die für jede Gruppe gelten, zu erfüllen. Dabei sind die oben genannten Regeln nicht die einzigen, die bei der Bildung von IOP-Gruppen eingehalten werden müssen. Eine weitere Regel schreibt z.B. vor, dass Instruktionen, die für die conditional register unit (CRU) bestimmt sind, nur an die erste und zweite Stelle (Platz 0/1) der IOP-Gruppe kommen dürfen. Zusätzlich gibt es noch die Regel für die oben erwähnten „cracked and millicoded“ Instruktionen, die vorschreiben, dass bei „cracked“ Instruktionen, also Instruktionen, die in genau zwei IOP aufgeteilt sind, die beiden IOPs derselben Gruppe zugeteilt sein müssen. Wenn sie nicht in dieselbe Gruppe passen, wird die Gruppe verworfen und es wird eine neue Gruppe aufgebaut. Instruktionen, die auf „cracked“ Instruktionen 32 folgen, können nur dann derselben Gruppe zugeteilt werden, wenn genügend Platz vorhanden ist. „Millicoded“ Instruktionen bilden hingegen immer eine neue Gruppe. Die Instruktionen, die auf „millicoded“ Instruktionen folgen, bilden erneut eine neue Gruppe. Weiterhin muss eine Gruppe die folgend aufgelisteten Ressourcen zur Verfügung haben, bevor sie zur Ausführungseinheit (Execution Core) weitergebenen werden kann: - - - Group Completion Table entry: Der GCT ist das PowerPC 970 Äquivalent eines Umordnungs- Puffers. Der GCT hat 20 Einträge. Mit diesen Einträgen kann er sich 20 aktive Gruppe merken, während sich die einzelnen Instruktionen der Gruppen in ihren ca. 100 Ausführungsstadien in der Pipeline befinden. Sind die 20 Einträge im GCT voll, kann keine neue Gruppe zum GCT hinzugefügt werden, egal wie viele Instruktionen (durch unvollständig Gruppen) zu einem gewissen Zeitpunkt in der Ausführungsphase sind. Issue Queue slot: Wenn nicht genügend Plätze (slots) in den zugeteilten Issue Queues vorhanden sind (VPU Vector Issue Queue kann 16, die VALU Queue kann 20 Einträge beinhalten), um alle Instruktionen einer Gruppe unterzubringen, dann muss die Gruppe auf ihre Abwicklung warten. Rename Registers: Es müssen genug Ressourcen für Register-Umbenennung vorhanden sein, so dass Instruktionen, die Register Umbenennung benötigen, diese zur Verfügung haben, wenn sie ihrer Issue Queue zugeteilt werden. Zusammengefasst ist es damit möglich, dass eine einzelne Instruktion, die eine der Regeln nicht erfüllt, die ganze Gruppe in ihrer Ausführung behindert. Wegen eben dieser Benutzung von Gruppen ist die PowerPC 970 InstruktionsAbfertigungsbandbreite aufgrund vieler komplexer Faktoren sehr empfindlich, nicht zuletzt wegen einer Art internen Fragmentierung des GCT (Group Completion Table), die das Aufkommen einer unnötigen Drosselung der Ausführungsbandbreite zur Folge hat, wenn zu viele Gruppen im GCT nicht vollständig bestückt sind oder fast leer sind. Theoretisch ist der PowerPC 970 Prozessor in der Lage, 200 Instruktionen in den verschiedenen Stufen fetch, decode, execution und completion pro Zyklus unterzubringen. In Wirklichkeit ist es jedoch wahrscheinlicher, dass unter gegebenen Umständen eine nicht geringe Anzahl an Ausführungssegmenten wegen unvollständiger Gruppenbildung aufgrund von Einschränkungen durch die erwähnten Regeln leer verbleiben. Im Vergleich zu multi-length-Instruktionen bei modernen CISC-Architekturen, ist der Aufwand zum Herunterbrechen der Instruktionen in einfache interne Instruktionen beim PowerPC 970 Prozessor wesentlich geringer. Bei verschieden langen Instruktionen stellt sich das Problem, wie die CPU wissen soll, wo sich die nächste Instruktion befindet. Diese kann herausgefunden werden, indem man die erste Instruktion dekodiert, was Zeit kostet und ein Performance-Bottleneck darstellt. RISC CPUs hingegen besitzen keine multi-length –Instruktionen, wodurch sich das Dekodieren bedeutend einfacher gestaltet. Die x86 CPU besitzt 8 Register, deutlich weniger als der PowerPC 907 Prozessor. Die Vorstellung einer Schleife mit 10 Variablen in Iteration setzt bei einer x86 CPU Hardware-Hilfestellung voraus. Diese Hilfestellung ist die eingesetzte Out-Of-Order-Execution, wobei rename-Register zum Einsatz kommen. Out-Of-Order-Execution wird hauptsächlich dazu benutzt, um die Performance zu erhöhen, indem die CPU verschiedene Instruktionen gleichzeitig ausführt. Sowohl die x86 CPU als auch die PowerPC 970 CPU setzt dieses Verfahren ein. Bei der x86 CPU mit den 8 Registern wird dies problematisch, da der voraus folgende Programmfluss untersucht werden muss, um Instruktionen zu finden, die außerhalb der Programmreihenfolge ausgeführt werden können. Das bedeutet für die x86 CPU, dass die 8 Register sehr oft umbenannt werden müssen, was eine komplexe Logik erfordert. Die RISC-Architektur des PowerPC 970 hat hier einen erneuten Vorteil, da mehr Register zur Verfügung stehen, was die Umbenennungs-Logik reduziert und damit den Hardwareaufwand. RISC CPUs, wie der PowerPC 970 Prozessor, haben gegenüber CISC CPUs den weiteren Vorteil, 33 dass sie hohe Performance bei deutlich niedrigerem Energieverbrauch liefern. Der PowerPC 970 Prozessor bietet ebenfalls Multi-Threading, was die Performance verdoppelt. Intel´s HyperThreading hingegen steigert die Performance nur um 20%. Als Apple die ersten benchmarks des neuen PowerPC 970 veröffentlichte, führt dies zu Streitigkeiten. Die Werte, die Apple für einen Dell PC im Vergleich zum PowerPC 970 angab, waren erheblich schlechter, als die, die auf der Website von SPEC präsentiert wurden. Apple wurde dafür stark kritisiert. Der Grund für die unterschiedlichen Werte lag aber in der Verwendung von unterschiedlichen Compilern. Die Verwendung des GCC Compilers z.B. erzeugt fehlerhaften Code für einige PowerPC-Anwendungen. Quelle: c`t-Magazin 2.2.2 PowerPC 970 Execution Core Quelle: arstechnica.com Der PowerPC 970 beinhaltet insgesamt 12 Ausführungseinheiten. Zwei von diesen Einheiten sind 34 sogenannte Integer Units, kurz IUs, die nahezu alle Integer Instruktionen ausführen. Der PowerPC 970 unterscheidet sich somit von Prozessoren wie dem G4e oder P4, die Integer Operationen in die zwei Typen „simple“ und „complex“ einteilen. Diese beiden IUs sind verbunden mit 80 Mehrzweckregistern (GPRs, General Purpose Registers), davon 32 feste und 48 rename-Register. Quelle: arstechnica.com Diese beiden Integer Units sind aber nicht symmetrisch. Laut der Dokumentation des Power4 Prozessors führt die erste Integer-Unit alle Integer-Instruktionen aus, während die zweite alle Integer-Instruktionen bis auf Multiplikation und Division ausführt und auch für Operationen mit den special-purpose-Registern vorgesehen ist. Alle anderen Integer-Instruktionen können wahlweise die erste oder zweite Einheit nutzen. Integer-Division und special-purpose-registerInstruktionen sind relativ selten, so dass die Performance durch diese Separierung nicht nennenswert zunimmt. Da der 970 Prozessor aber mit Instruktionsgruppen arbeitet, scheint dieser geringfügige Grad an Spezialisierung schon sinnvoll. Während IBM aber bis jetzt noch keine Angaben zu Latenzzeiten der Instruktionen gemacht hat, zeigen die beim Power4 Prozessor veröffentlichten Angaben, dass der größte Teil der Integer Instruktionen in einem Zyklus ausgeführt wird, während einige wenige komplexere Integer Instruktionen mehrere Zyklen benötigen. Von anderen Instruktionen unabhängige Integer-Instruktionen brauchen also nur einen Zyklus, während von anderen Instruktionen abhängige Integer-Instruktionen dann mit einem Wartezyklus insgesamt 2 Zyklen brauchen. Durch die zwei separaten Integer Einheiten kann dann in einer dieser Einheiten die abhängige Integer- Instruktion gehalten werden, während in der anderen die Instruktion ausgeführt werden kann, von der die andere abhängt. 2.2.2.1Rename Register Der PowerPC 970 hat viel mehr rename-Register als z.B. der G4e. Das Instruktionsfenster (bis zu 200 Instruktionen in den verschiedenen Stufen fetch, decode, execution und completion) ist ebenfalls bedeutsam größer als das vom G4e(bis zu 16 Instruktionen). Natürlich braucht dann der PowerPC 970 auch viel mehr rename-Register, um alle nützlichen Möglichkeiten wie z.B. loop unrolling für ein so großes Instruktionsfenster zu ermöglichen. Je mehr Instruktionen sich in den unterschiedlichen Phasen der Ausführung befinden, desto mehr Daten müssen in Registern gespeichert werden. 2.2.2.2Die CR Logical Unit 35 Beim PowerPC 970 Prozessor gibt es eine Extrabehandlung für logische Operationen, die normalerweise von einer Integer Einheit gehandhabt werden. Für diesen Fall hat der 970 Prozessor eine separate Ausführungseinheit, die CR Unit. Diese Einheit ist für die Handhabung von logischen Operationen in bezug auf das condition-register zuständig. Das condition register ist ein Teil der ISA (instruction set architecture) des PowerPC 970, das dieselbe Funktion wie das x86er Prozessor Status Wort (PSW) hat und diese in einer flexiblen und programmiererfreundlichen Art kontrolliert. Fast alle arithmetischen Operationen haben nach ihrer Ausführung die Möglichkeit, verschiedene Flags in dem 32-bit PowerPC 970 condition- register zu setzten. Mit einer Ansammlung von Instruktionen zur Manipulation von Flags, kann der Programmierer diese durch logische Operationen wie AND, OR, NOT... manipulieren, was dann von der CR-Unit ausgeführt wird. 2.2.2.3Load-Store Units Der PowerPC 970 Prozessor hat zwei identische Load-Store Einheiten die, wie hier aufgrund fehlender Informationen angenommen werden muss, alle LOADs und STOREs für den gesamten Chip ausführen. Das gibt dem PowerPC 970 Prozessor buchstäblich zweimal soviel load-store Hardware wie dem G4e. Bei der Größe des Ausführungsfensters des PowerPC 970 scheinen zwei dieser Einheiten auch nötig zu sein, um alle Instruktionen im Ausführungsfenster mit Daten zu versorgen. Die großen Unbekannten sind hier die LOADs und STOREs für Vektor Operationen. Der Power4 Prozessor hat keine Vektor-Ausführungseinheit, was es unmöglich macht, mit irgendeiner Gewissheit eine Aussage zu machen, wie der PowerPC 970 Prozessor mit Vektor-SpeicherOperationen umgeht. Es könnte vermutet werden, dass Vektor LOADs in der einen Load-StoreEinheit und Vektor STOREs in der anderen gehandhabt werden. Es wäre aber auch möglich, dass der PowerPC 970 nach dem Modell des P4 vorgeht und nur die Vektor LOADs in den Load-StoreEinheiten handhabt und die Vektor STOREs einer der Vektor-Ausführungspipelines überlässt. 2.2.2.4Floating Point Units Die Floating-Point-Implementation des PowerPC 970 Prozessors ist beinahe exakt dieselbe wie beim G4e. Der PowerPC 970 hat aber zweimal soviel Hardware für diese Einheit wie der G4e. Hier gibt es, wie bei den Load-Store-Einheiten vermutet, zwei identische Floating Point Units (FPUs), von denen jede die schnellste Floating-Point Instruktion innerhalb von 6 Zyklen ausführen kann. Wie beim G4e brauchen Operationen mit Einfachgenauigkeit oder Doppelgenauigkeit für die Ausführung dieselbe Zeit. Die beiden Floating-Point Einheiten sind für alle Operationen außer Floating-Point Divisionen voll gepipelined. Floating-Point Die schnellsten Floating-PointInstruktionen, wie z.B. FMADD (siehe folgende Abbildung), brauchen 6 Zyklen. Quelle: IBM Der PowerPC 970 hat ebenfalls im Vergleich zum G4e Prozessor eine größere Anzahl an FloatingPoint Registern. Insgesamt gibt es davon 80, wovon 32 feste und 48 rename Register sind. Durch die doppelte Anzahl der Floating-Point-Einheiten im Vergleich zum G4e ist anzunehmen, dass hier gegenüber dem G4e zwar nicht eine doppelt so große Perfomance besteht, jedoch eine Performancesteigerung zu erwarten ist. Dies ist besonders der Fall, wenn man die tiefere Pipeline und den Vorteil der Taktrate in die Betrachtung mit einbezieht. 36 Weiterhin gibt der schnelle Frontsidebus des PowerPC (getaktet mit der halben Core Clock Speed) und der hohen Bandbreite des Speichers (Dual-Channel DDR400, 2x32-bit Kanäle) dem PowerPC 970 einen erheblichen Vorteil gegenüber dem G4e in Sachen Floating-Point Code. 2.3 Die Pipeline Die bis zu 16 Stufen tiefe Pipeline ist die größte Stärke des PowerPC 970 Prozessors und gleichzeitig seine wohl größte Schwäche. Um eine so lange Pipeline gefüllt zu halten, sind massive Ressourcen zur Sprungvorhersage notwendig. Das Instruktionsfenster muss aber so groß gestaltet sein, damit durch ungenutzte Lücken in der Pipeline („pipeline bubbles“ bei unvollständigen Instruktionsgruppen) keine Nachteile in Sachen Performance entstehen. Der P4 Prozessor kann, im Vergleich zum PowerPC 970 Prozessor, weniger pipeline bubbles tolerieren, weil es dort auch nicht so viele Ausführungs-Slots gibt. Betrachtet man die in der Präsentation von Pete Sandon (http://www3.ibm.com/chips/techlib/techlib.nsf/techdocs/A1387A29AC1C2AE087256C5200611780/$file/PPC 970_MPF2002.pdf) bei der Vorstellung des neuen PowerPC 970 Prozessors verwendete Grafik der Pipeline, werden im Vergleich zum Power4 Prozessor einige Fragen aufgeworfen und einige Pipeline-Stufen wirken etwas mysteriös. Die in der folgend dargestellten Grafik rot markierten Stufen sind entweder spekulativ oder unbekannt. Die Beschriftungen in den einzelnen Kästchen sind in der ursprünglichen Grafik nicht vorhanden. Quelle: arstechnica.com Zuerst fällt auf, dass schon in der fetch-Pipeline eine unbekannte Stufe existiert. Man könnte 37 vermuten, dass es sich um die Sprungvorhersage Stufe handeln könnte. Es würde aber keinen Sinn machen, die Sprungvorhersage als einen Teil der fetch/decode Pipelinestufe in dieser Grafik zu bestimmen. In einer solchen Grafik wird normalerweise die kleinste Anzahl an Zyklen dargestellt. Es ist also untypisch, hier extra für die Sprungvorhersage eine Stufe darzustellen, die nur dann auftaucht, wenn ein Sprung gegeben ist. Sicher ist auch nicht, ob die zusätzliche, unbekannte Stufe genau an dieser Stelle in der fetch/decode-Pipeline auftaucht. Das Zweite was auffällt, sind die zwei Xfer-Stufen in der Vektor-Pipeline. Beim Power4 Prozessor sind die Xfer Stufen eine Art von Haltestufen, wo Instruktionen solange warten, bis sie einer Instruktions-Gruppe zugeordnet werden. Beim Power4 Prozessor taucht eine Xfer- Stufe genau vor der Zuteilungsstufe (dispatch stage) auf und IOPs (internal operations) verbleiben dort, während sie auf die Freigabe von Ressourcen warten. Danach können sie einer Gruppe zugeteilt werden und zur Ausführungseinheit weitergeleitet werden. In der Ausführungsphase werden die IOPs in beliebiger Reihenfolge der Ausführungseinheit zugeteilt und wenn die Ausführung abgeschlossen ist, warten die Instruktionen in den anderen Xfer-Stufen auf das Fertigwerden der anderen Instruktionen ihrer Gruppe. Sind alle Instruktionen einer Gruppe mit der Ausführung fertig und ihrer Ergebnisse in die Register zurückgeschrieben, wechseln sie in die CP-Stufe (Complete Phase), wo sie schließlich abschließen. Der 970 Prozessor realisiert zwei neue Xfer-Stufen. In der Grafik befinden sich diese rechts nach der GD (group dispatch, Gruppenzuteilung) Stufe und vor der CP-Stufe (Complete Phase). Die erste neue Xfer Stufe wurde vermutlich hinzugefügt, um es den Vektor Instruktionen zu ermöglichen, zu der Vektor-Ausführungseinheit (vector execution unit) zu gelangen, die sich etwas weiter entfernt von dem Hauptkern befindet. Das VRF (vector register file) wurde bei den anderen register-files platziert, um load-store-Latenzzeit zu minimieren, was im Gegenzug aber die erste neue Xfer-Stufe notwendig macht. Die zweite neue Xfer Stufe wurde wegen der Rückkehr der Vektor-Instruktionen von der Vektor-Ausführungseinheit implementiert, um mit den anderen Instruktionen in ihrer Gruppe abschließen zu können. Diese beiden Stufen sind eine Art „Beförderungsstufen“, die hinzugefügt wurden, um eine Anpassung an die angeschlossene AltivecEinheit vorzunehmen. Durch die zwei benötigten Beförderungsstufen innerhalb der Pipeline, die der Prozessor benötigt, um die Instruktionen hin und her zu schicken, scheint die Altivec-Einheit (VektorAusführungseinheit) ziemlich isoliert zu sein. Dadurch wäre auch eine Begründung für die dritte und letzte, neu hinzugefügte zweite RF-Stufe (register file read) gefunden. Weil die VPERM (Vector Permute Logic Unit) und VALU (Vector Arithmetic Logic Unit) so weit entfernt von dem Vektor Register File (VRF) sind, wird ein extra Zyklus benötigt, damit diese Operanden aus dem Register auslesen können. Eine entsprechende Extra-WriteBack Stufe wird nicht benötigt (passiert während Xfer), auch wenn es eines Extra-Zyklus bedarf, um die modifizierten Werte zurück in das VFR zu bringen. Das ist aus zwei Gründen so. Erstens ist ein WriteBack, wie z.B. ein STORE eine „ausführen und vergessen“ Operation. Weiterhin muss ein WriteBack abgeschlossen sein, bevor die Instruktion abschließen kann. Dies wird durch die hinzugefügte Xfer Stufe realisiert, die der Vektoreinheit einen Extra-Zyklus verschafft, den sie braucht, um ein Zurückschreiben der modifizierten Werte vornehmen zu können. 2.4 Apple G5 System Weil IBM nicht Mitglied im HyperTransport-Konsortium ist, besitzt der PowerPC 970 ein anderes Buskonzept, das aber, genauso wie beim Hypertransport, eine bidirektionale Punkt-zu-PunktVerbindung mit einer effektiven Bandbreite von bis zu 6,4 GByte/s realisiert. Es ist aber möglich, einen Brückenbaustein (Bridge) zu Hypertransport einsetzten. Der PowerPC 970 900MHz frontside Bus arbeitet mit 450MHz DDR . Der Bus besteht dabei aus zwei unidirektionalen 32-bit point-to-point Verbindungen. Eine Verbindung ist dabei von der CPU zum angebundenen Chip (die Northbridge) und die andere vom Chip zur CPU. Beide Verbindungen arbeiten mit 900MHz. Bei der Übertragung von 4 Byte hin und zurück bei 900MHz ergibt das 3,6 GB/s in jede Richtung. Insgesamt ist die Bandbreite also 7,2 GB/s. Zieht man den Command- und Address-Overhead ab, erhält man 6,4 GB/s. 38 Der PowerPC 970 Prozessor soll den G5-Mac laut Hersteller zum „schnellsten PC der Welt“ machen. Doch es fehlt an G5-optimierten Anwendungen und einem 64-Bit-Betriebssystem. Ein weiteres Problem zeigt sich bei der versuchten Integration eines G5-Prozessors in ein Notebook. Laut dem Chef-Entwickler von Apple, Jon Rubinstein, ist der Energieverbrauch des G5Prozessors das Problem. Der Prozessor benötigt, laut Rubinstein, sehr große Kühlkörper. Primäres Ziel ist es jetzt, in Zusammenarbeit mit IBM, den Stromverbrauch zu senken, so dass man in Zukunft ein PowerBook mit G5 Prozessor anbieten kann. Auch lieferte der G5 Prozessor sehr gemischte Benchmark-Resultate, als er von Testern der Zeitschrift c’t getestet wurde. Hierbei kamen verschiedenen von IBM zur Verfügung gestellte Compiler zum Einsatz, von denen die neuesten die besten Ergebnisse lieferten. Der ursprüngliche Compiler stammt vom Power 4 Prozessor und wurde von IBM in der Optimierung ergänzt. Für das G5-System wurde im wesentlichen die Power4 Architektur übernommen auf die Bedürfnisse modifiziert. Die Architektur wurde auf Wachstum ausgelegt und die am höchsten entwickelten Technologien wie etwa AGP 8X, Hypertransport und PCI-X, verwendet. Quelle: ct Die neuen G5-Modelle gibt es mit 1,6-, 1,8- und zwei 2,0-GHz-Prozessoren. Wie auch in der obigen Abbildung zu erkennen ist, hat Apple nicht nur den Prozessor erneuert, sondern die gesamte Systemarchitektur auf den neusten Stand gebracht. Durch die langsame Weiterentwicklung des G4Vorgängersystems hätte Apple fast den Anschluss im PC-Markt verloren. Im G5-Top-Modell arbeitet ein zwei mal 32-Bit breiter Frontsidebus mit, laut Apple, 1GHz. Hierbei handelt es sich wiederum um 500 MHz mit jeweils zwei Datenpaketen pro Takt (DDR). Somit wird beim G5-Top-Modell ein effektiver Datendurchsatz von 7,1 GByte/s zwischen Prozessor und Controller erreicht. Die G5-Modelle mit 1,8- und 2,0-GHz sind durch ein Speicher-Interface mit zwei DDR-400-Kanälen, die bis zu 6,4 Gbyte/s Daten zwischen dem Prozessor und dem Arbeitsspeicher übertragen können, auf dem neusten Stand der Technik. Der maximale Speicherausbau beträgt 8 GByte, wobei mit geeigneten Speicher-Riegeln auch ein Ausbau auf 16 Gbyte möglich sein soll. Wie schon am Anfang dieses Kapitels erläutert, sind Komponeten wie PCI-X, Gigabit Ethernet, FireWire, USB 2.0 und Serial ATA über eine HyperTransport-Brücke 39 angeschlossen. Die HyperTransport-Brücke arbeitet bidirektional mit jeweils 16-Bit (nur mit halber Kraft) und, laut Apple mit 800 MHz (2 x 400 MHz), also der halben Taktrate wie beim AMD Opteron. Die Geamtübertragungsrate beträgt hier 3,2 GByte/s. Wie auch in der obigen Abbildung zu erkennen, ist der Grafikkarten-Steckplatz, AGP-8X, direkt an den System-Controller angeschlossen. Weiterhin gibt es zwei unabhängige Serial-ATA-Busse, die für maximal zwei Festplatten vorgesehen sind. Maximal ist zur Zeit 500 Gbyte Plattenspeicher möglich. In allen Modellen gibt es 3 Steckplätze für Erweiterungskarten, wobei diese im 1,6 GHz-Modell noch der alten PCI-Norm entsprechen (64 Bit, 33 MHz). In den anderen G5-Modellen erfüllen sie den PCI-X Standard (1 x 64 Bit mit 133 MHz, 2 x 64 Bit mit 100 MHz, abwärtskompatibel zu bisherigen PCI-Normen). Damit ist theoretisch ein Datendurchsatz von insgesamt 2 GByte pro Sekunde zu erreichen. Für die Möglichkeit von digitalen Surround-Sound sorgen optische Audio-Ein- und -Ausgänge. 3 LCT Hardware Teil 3.1 Aufgabenbeschreibung Wir haben uns zur Aufgabe gemacht, den PowerPC auch in punkto Hardware zu untersuchen. Dabei haben wir uns, soweit es möglich war, am DLX-Laborversuch orientiert. Gleichzeitig soll aber auch auf die verwendete Softwareumgebung eingegangen werden. 3.2 Die Software Wir verwendeten den „XRAY-Simulator für PowerPC“ von der Firma „Accelerated Technology“. Hierbei handelt es sich um eine Testversion, deren Laufzeit durch eine Lizenzdatei begrenzt wird. Mit im Paket befindet sich ebenfalls ein Compiler für C-Programme von der Firma „Microtec“, der den für PowerPC optimierten Assembler-Code erzeugt. Das kompilieren geschieht wie folgt: mccppc -g -o Demo.x Demo.c Das „-g“ erzeugt Debug-Informationen und auf „-o“ folgt der Name des Output-Files. Zum Schluss muss noch die Quelldatei angegeben werden. 3.3 Der Simulator Der „XRAY-Simulator“ ist eine Art Debugger, der die Umgebung einer bestimmten Prozessorfamilie simuliert. In unserem Fall handelt es sich um den G2-PowerPC 603. Außerdem werden folgende PowerPC-Prozessoren unterstützt: • Motorola/IBM PowerPC 603, 603e, 604, 604e, 740, 750 • Motorola MPC505, MPC509, MPC555, MPE603e, MPC821, MPC823, MPC850, MPC850SAR, MPC860, MPC860SAR, MPC860T, MPC8240, MPC8260 PowerQUICC II • IBM PowerPC 403GA/GB/GC/GP/GCX, 401GF Die AltiVec-Einheit wird nicht unterstüzt. Nachdem man seine Applikation erstellt und kompiliert hat, kann sie in den Simulator geladen werden. Es gibt dann zwei Möglichkeiten den Programmcode zu betrachten. Zum einen ist er als Assemblerprogramm zu sehen und mittels Low-Level-Steps zu verfolgen. Die andere Möglichkeit ist, sich nochmal das C-Programm anzuschauen und es mittels Hi-Level-Steps zu verfolgen. Zwischen beiden Möglichkeiten kann beliebig hin und her gewechselt werden. In beiden Fällen gibt es aber eine Markierung, die anzeigt, bei welchem Schritt sich das Programm gerade befindet. 40 Natürlich kann man auch das ganze Programm auf einmal ausführen. Außerdem können Haltepunkte im Programm gesetzt werden, bei denen gestoppt werden soll. Diese können auch an Bedingungen geknüpft werden, z.B. an einen bestimmten Wert den eine Variable des C-Programms haben soll. Zu Speicheradressen von Variablen, die im Speicher abgelegt werden, kann per Eingabe ihres Namens direkt gesprungen werden. Zusätzlich gibt es mehre Ansichtsmöglichkeiten in Form von ASCII, Long, Short usw. und durch Verändern der Spaltenanzahl im Speicherfenster. Das gleiche gilt auch für den Stack. Mit am Wichtigsten ist aber das Register-Fenster. Hier können sämtliche Register des Prozessors betrachet. Das Fenster ist durch mehrere Registerkarten unterteilt. Es gibt z.B. eine Registerkarte für die Floating-Point-Register und eine andere für die CPU-Register wie das Link-Register oder die 32 General-Purpose-Register. Bei Speicher, Register und Stack wird der jeweilige Wert, der sich verändert hat, durch ein Verändern der Farbe markiert. Im oberen Screenshot ist links der Hi-Level-Code zu sehen. In Zeile 9 ist das Programm angehalten worden. Dies wird durch den rechteckigen Kasten um die auszuführende Zeile gekennzeichnet. Rechts daneben befinden sich die CPU-Register mit den 32 General-Purpose-Registern, MachineStatus-Register, Control-Register, Link-Register etc. Im unteren Teil befindet sich die Ansicht auf den Speicher. Er wird als „Long“ dargestellt mit 8 Spalten. 41 In diesem Screenshot ist statt der Hi-Level-Ansicht jetzt die Low-Level-Ansicht auf den Code zu sehen. Auch hier ist die Stelle im Code wieder durch einen rechteckigen Kasten markiert, wo das Programm angehalten wurde. Im rechten Teil sieht man die Floating-Point-Register und an erster Stelle das Floating-Point-Status-Control-Register. Der Stack ist im unteren Bereich angeordnet. Die Markierung “<- SP, FP“ zeigt auf die aktuelle Position des Stacks. 42 Register Beim PowerPC sind die Register in drei logische Sätze unterteilt. Es gibt die User Instruction Set Architecture (UISA), die Virtual Enviroment Architecture (VEA) und die Operating Enviroment Architecture (OEA). Für uns ist die UISA von Bedeutung. Die beiden anderen ArchitekturSichten erweitern diese Sicht um weitere Register, die für unsere Untersuchungen nicht von Bedeutung sind. Die 32 General-Purpose-Register (32 Bit) werden hauptsächlich für Speicherung von Adressen, Adressberechnung und Rechnung mit Integer-Werten benutzt. Auf Beispiele wird später noch genauer eingegangen. Weiterhin gibt es 32 Floating-Point-Register (64 Bit), die für Gleitkommarechungen zur Verfügung stehen. Sie beinhalten Gleitkommazahlen nach IEEE. Das Condition-Register (32 Bit) ist eine Besonderheit gegenüber herkömmlichen Prozessoren (x86, MIPS, etc.). Hauptsächlich wird es für Vergleiche von Integer-Werten und deren Ergebnissen benutzt. Beim Floating-Point-Status (32 Bit) und Control-Register handelt es sich um ein Register, das verschiedene Flags für die Gleitkommarechnung zur Verfügung stellt. Dabei handelt es sich z.B. zum Aufzeichnen von Exceptions (Division durch 0) oder auch die Festlegung des aktuellen Rundungsmodus. Das XER-Register (32 Bit) wird bei bestimmten Operationen benutzt, um Flags für Overflow oder Carry etc. zu setzen. Die Sprungzieladresse wird im Link-Register (in unserem Fall 32 Bit) abgelegt. Das Count-Register (in unserem Fall 32 Bit) kann zusammen mit Sprungbefehlen von Bedeutung sein. U.a. kann es auch mit der Berechnung von Sprungvorhersagen in Zusammenhang stehen. 43 3.4 Instruction-Format Eine Instruktion beim PowerPC ist 32 Bit lang. Die ersten 5 Bit beinhalten den Primary-OP-Code. Zusätzlich benötigen einige Befehle noch einen Secondary-OP-Code. Die restlichen Bits werden für verschiedene Befehlsformat verwendet. Im Grunde jedoch ist das Befehlsformat des PowerPCs ähnlich des MIPS oder der DLX. Zur Verdeutlichungen sollen hier ein paar Beispiele gezeigt werden: Die I-Form wird z.B. für Branch-Befehle verwendet. Das Feld LI enthält die Zieladresse zu der gesprungen werden soll. AA und LK sind zusätzliche Parameter. Wenn LK=1 ist, dann wird die Adresse der Folgeinstruktion als Rücksprungadresse ins Linkregister gespeichert. AA gibt an, ob die Adresse in LI relativ zur jetzigen Adresse der Instruktion ist oder es sich um eine absolute Adresse handelt. Bei der B-Form kann es sich z.B. um einen Branch-Conditional-Befehl handeln. AA und LK werden wieder wie oben schon erwähnt verwendet. Hier ist BD die Zieladresse für den Sprung. Die Felder BO und BI geben die Bedingungen für den Sprung an. Diese beziehen sich auf einen zuvor ausgeführten Vergleich durch den Compare-Befehl (CMP), dessen Ergebnis im Condition-Register (CR) steht. So geben die Bits in BO an, welches CR-Bit benutzt werden soll und die Bits in BI liefern die Bedingung bei dem der Sprung ausgeführt wird. Beispiel: BI = 00000 (Negatives Ergebnis des Vergleichs) BO = 011zy (Springe, wenn die Bedingung wahr ist) Es wird also gesprungen, wenn das Ergebnis negativ war. Die mit ‚z’ benannten Bits werden ignoriert. Das ‚y’-Bit gibt an, ob es möglich erscheint, dass der Sprung ausgeführt wird. Die B-Form kann aber auch als normaler Sprung-Befehl benutzt werden. Dazu müsste dann in BO „1z1zz“ stehen. Somit würde immer an die Adresse in BD gesprungen. Die D-Form wird hauptsächlich für arithmetische und logische Befehle benutzt (z.B. Addieren, AND, OR, aber auch für Store-Word, Load-Word). 44 Load Floating-Point Double (LFD) gehört zur D-Form. In das in D angegebene Floating-PointRegister wird das Doppelwort von einer Speicheradresse geschrieben. Die Speicheradresse berechnet sich aus dem Wert in Register A und dem Offset d. Ein weiterer Befehl, der zur D-Form gehört, ist Add Immidiate (ADDI). Dabei wird in das Register D die Summe aus dem Register A und des Wertes in SIMM geschrieben. Auch Store Word (STW) gehört in die Kategorie der D-Form-Befehle. Hierbei wird der Wert aus Register S in den Speicher geschrieben. Die zugehörige Adresse setzt sich aus dem Wert in Register A und dem Offset d zusammen. OR Immidiate (ORI) gehört ebenfalls zur D-Form. Hierbei werden der Wert aus Register A und der Wert UIMM miteinander oder-verknüpft. Das Ergebnis wird ins Register S geschrieben. Oft wird der Befehl „ori 0,0,0“ als nop (no-operation) verwendet. Beim Compare Immidiate (CMPI) werden die Werte aus dem Register A und dem SIMM-Feld verglichen. Das Ergebnis des Vergleichs wird in das Condition Register D geschrieben. Dieser Befehl gehört auch in die D-Form-Kategorie. L ist für spätere Befehlserweiterung (z.B. 64 Bit) reserviert und hat somit für die 32-Bit Operationen keine Bedeutung und sollte eine 0 enthalten, da sonst der Befehl ungültig ist. 45 Compare Logical Immidiate (CMPLI) funktioniert nach dem gleichen Prinzip wie der Compare Immidiate Befehl zuvor. Jedoch muss es sich im Feld UIMM um ein Unsigned Immidiate handeln. Der „einfache“ Compare-Befehl (CMP) gehört zur X-Form. Diese Form hat einen Secondary-OPCode, der in den Bits 21-30 enthalten ist. A und B bezeichnen die Register, die miteinander verglichen werden sollen. In crfD ist die Zielposition im Condition-Register (CR) für das Ergebnis des Vergleichs enthalten. L ist für spätere Befehlserweiterung (z.B. 64 Bit) reserviert und hat somit für die 32-Bit Operationen keine Bedeutung. Das sind im Groben alle Befehle bzw. Formate, die wir bei der Untersuchung des PowerPCs mit dem Simulator entdeckt haben bzw. vom Compiler verwendet wurden. 46 3.5 Ergebnisse Grundsätzlich besteht ein Assembler-Programm aus einer 32-Bit Programmadresse und einem 32Bit Befehl. Da aber die Lesbarkeit des Befehls schlecht ist, erzeugt der Simulator als dritte und vierte Spalte den entsprechenden Assemblercode. Bestimmte Adressen im Speicher oder im Programm werden hinter ‚#’ dargestellt. Somit bekommt man folgendes zu sehen: 0001001C 3BE00003 00010020 3C600001 00010024 93E3234C addi addis stw 31,0,0x3 3,0,0x1 # 0x1234C hi(a) 31,0x234c(3) Globale Variablen werden im Speicher abgelegt. Der obere Programmausschnitt zeigt die Zuweisung des Wertes ‚3’ zur globalen Variablen ‚a’. Zu erst wird das Ergebnis der Addition aus den Werten ‚3’ und ‚0’ ins Register 31 geschrieben. Ins Register 3 wird der Wert 0x10000H für die Adressberechnung für den Speicherplatz geschrieben. Anschließend wird die ‚3’ aus Register 31 an die Adresse 0x1234cH geschrieben. Diese Adresse setzt sich aus dem Wert in Register 3 und dem Offset 0x234cH zusammen. Der Stack wird in unserem Fall im Speicher ab Adresse 0x32500H verwaltet. In Register 1 liegt immer der aktuelle Wert des Stackpointers. Lokale Variablen werden in Abhängigkeit von diesem Wert auf dem Stack abgelegt. Das zeigt die folgende Zeile: 00010098 9081000C stw 4,0xc(1) Hierbei wird der Wert aus Register 4 auf dem Stack gelegt. Die Adresse ist dabei um 0xcH höher als der Wert im Register 1 (der aktuelle Stackpointer). Zu Beginn der main()-Methode im C-Programm werden einige Register gerettet. Dies wird gemacht, da diese Register innerhalb der Methode verändert werden und sie nach Abschluss wieder gebraucht werden, um Aufräumarbeiten durchzuführen. 00010000 00010004 00010008 0001000C 00010010 00010014 00010018 7C0802A6 9421FFE8 93C10010 93E10014 9001001C 90610008 9081000C mfspr stwu stw stw stw stw stw 0,LR 1,-24(1) 30,0x10(1) 31,0x14(1) 0,0x1c(1) 3,0x8(1) 4,0xc(1) Die Rücksprungadresse wird in Register 0 gesichert (mfspr = move from special purpose register). Danach wird der Stackpointer neu gesetzt, der alte Wert aus Register 1 an die neue Adresse geschrieben und der neue Wert wieder ins Register 1 (stwu = store word and update). In Abhängigkeit vom aktuellen Stackpointer (Register 1) werden jetzt die Register 30, 31, 0, 3 und 4 auf dem Stack gesichert. Am Ende der main()-Methode werden diese Wert wieder vom Stack geholt und in die Register zurückgeschrieben. Auch bei Funktionsaufrufen werden u. U. solche Sicherungen vorgenommen. 47 Sowohl for- als auch while-Schleife in C werden vom Compiler wie folgt umgesetzt: for(i=1; i<=zahl; i++) { ... } 000100C8 000100CC 000100D0 ... 000100EC 000100F0 000100F4 while(i <= zahl) { ... i++; } 7C032000 41810028 ... cmp bc 0,0,3,4 0xc,0x1,fakultaet+0x44 #0x000100F4 7C032000 4081FFE0 ... cmp bc 0,0,3,4 0x4,0x1,fakultaet+0x20 #0x000100D0 Wie schon beim Instruction-Fromat erwähnt, vergleicht der PowerPC erst den Wert und schreibt das Vergleichsergebnis in das Condition-Register (CR). Daraufhin wird dann ein Sprung ausgeführt oder nicht. Bevor jetzt die for-Schleife durchlaufen wird, wird überprüft, ob das Durchlaufen überhaupt erforderlich ist. Wenn der Wert aus Register 3 (i) größer ist als der in Register 4 (zahl), dann überspringe die Schleife. Konkret wird im Branch-Befehl überprüft, ob das Ergebnis größer ist (0x1) und wenn das zutrifft (0xc), soll gesprungen werden. Nachdem die Befehle in der Schleife ausgeführt wurden, wird wieder überprüft, ob die Schleife noch mal durchlaufen werden muss. Dazu wird jetzt überprüft, ob das Ergebnis größer ist (0x1). Ist die nicht der Fall (0x4), dann springe zurück. do { ... i++; } while(i <= zahl); Bei der do…while-Schleife verhält es sich anders. Hierbei wird nur noch ein Vergleich benötigt, denn sie wird mindestens einmal durchlaufen. Somit fällt aus dem oben gezeigten AssemblerProgramm der erste Vergleich mit Sprung weg. Der untere Teil verändert sich nicht. Wir haben aber dadurch eine Optimierung des Codes auf C-Ebene erreicht, da wir drei Zeilen weniger im Assembler-Programm benötigen. Denn auch der Vergleichswert in Register 4 (zahl) braucht nicht am Anfang geladen zu werden. Bei dem folgenden Funktionsaufruf werden die Variablen x und y in Registern übergeben. Erst in der Funktion selber werden die Werte auf dem Stack gesichert. Auch das Ergebnis wird wieder im Register zurückgegeben und nach der Rückkehr in die entsprechende Variable im Speicher geschrieben. int addieren(int x, int y) { return x + y; } 48 3.6 Optimierung auf Assembler-Ebene Hierbei hat uns der Simulator leider im Stich gelassen. Es gibt zwar die Möglichkeit bei dem mitgelieferten Compiler den Assembler-Code aus dem C-Programm zu bekommen. Somit konnte dieser auch bearbeitet werden. Hierfür wird folgender Compiler-Aufruf benötigt: mccppc –S Demo.c Damit erhält man den Assemblercode des C-Programms in der Datei Demo.src. Das Problem bestand aber jetzt darin, den bearbeiteten Assembler-Code wieder in den Simulator zu laden. Denn dazu bräuchte man ein sog. „absolute File“ z.B. mit der Endung „.x“. Um solche Dateien aus Assembler-Code zu bekommen, wird ein Compiler für Assembler-Code benötigt. Nach stundenlangen Recherchen in den beigefügten Dokumentationen und im Internet auf den Seiten des Herstellers, ist es uns nicht gelungen eine adäquate Lösung für dieses Problem zu finden. Die einzigen Ergebnisse waren mehrere Abstürze des Simulators. Da es sich aber bei der Software um eine Testversion handelt, wurde auf mehrere Tools vom Hersteller verzichtet bzw. wurde eine Ausführung durch Eingrenzen der Lizenzrechte verhindert. Dies bestätigt auch folgende Meldung, die bei einem der vielen Versuche erschien: (F) #C0698 licensing failure (-10) 4 Literaturliste PowerPC G1-G4, IBM PowerPC 970 und Bildquellen IBM: http://www-5.ibm.com/de/pressroom/presseinfos/2003/030624_2.html Artikel: PowerPC 970: First in a new family of 64-bit high performance PowerPC processors Manual: PowerPC Microprocessor Family: AltiVec(TM) Technology Programming Environments Manual Artikel von Jon Stokes: http://www.arstechnica.com/cpu/02q2/ppc970/ppc970-1.html http://www.arstechnica.com/cpu/03q1/ppc970/ppc970-0.html c't-Artikel: Johannes Schuster Jon Rubinstein, Chef der Hardware-Entwicklung bei Apple, im c't-Interview aktuell,Apple,G5, Rubinstein, PowerPC 970, IBM c't 21/03, Seite 46 Christof Windeck, Jörg Wirtgen, Herbert Schmid Stufe vier AMD Athlon 64, Apple PowerMac G5, FX und die Konkurrenz Prüfstand,AMD Athlon 64 -- Apple Power Mac G5,AMD-8000,PowerPC 970,PPC970,G4,Athlon XP,Opteron,Intel Pentium 4,Xeon,E7505,i865,i875,DDR400,PC3200R,Registered,Benchmark,ZweikanalRAM,Chipsatz,K8X800 PROII,AMD Athlon 64 FX-51,PowerMac G5,Dual 2.0 c't 20/03, Seite 98 Johannes Schuster, Stephan Ehrmann, Christoph Laue (jes) 64 in spe Apples Power Mac G5 mit 1,6 GHz im ersten Test Prüfstand,Power Mac G5 ,Power Mac G5 1,6 GHz, PowerPC 970, HyperTransport, USB 2.0, PCI-X 49 c't 19/03, Seite 114 AltiVec-Bilder http://page.inf.fu-berlin.de/~vratisla/RA99/altivec.html Sonstige Links: http://www.realworldtech.com/page.cfm?AID=RWT101502203725 http://www.intel.com/technology/itj/2002/volume06issue01/art01_hyper/p06_execution_engine.ht m Die Geschichte des PowerPC G1-G4: http://www.apple.com/de/ http://www.motorola.com/de/ http://core.de/core/powerpc.html, http://www.fhwedel.de/cis/archiv/seminare/ws9900/ue/PowerPC/PowerPC.html http://www.computer-archiv.de/ http://www-1.ibm.com/servers/eserver/pseries/hardware/whitepapers/power/ppc_601.html Advance Information PowerPC 604 RISC Microprocessor Technical Summary (IBM / Motorola) Advance Information PowerPC 750 RISC Microprocessor Technical Summary (IBM / Motorola) Advance Information MPC 7400 RISC Microprocessor Hardware Specifications (Motorola) Quellen zum Hardwareteil: Accelerated Technology Microtec www.acceleratedtechnology.com www.mentor.com/microtec 50 5 Anhang Quellcode int a; int b; int summe; void addierenG(); int addierenL(); void fakultaet(); int main(int argc, char **argv) { a = 3; b = 4; addierenG(); summe = addierenL(4 , 5); fakultaet(3); return 0; } void addierenG() { summe = a + b; } int addierenL(int x, int y) { return x + y; } void fakultaet(int zahl) { int result = 1; int i = 1; for(i=1; i<=zahl; i++) { result = result * i; i++; } } 51 Compilierter Assemblercode >>> DEMO\#1..9 stack.sizeof: 00010000 7C0802A6 00010004 9421FFE8 00010008 93C10010 0001000C 93E10014 00010010 9001001C 00010014 90610008 00010018 9081000C >>> DEMO\#10 0001001C 3BE00003 00010020 3C600001 00010024 93E3234C >>> DEMO\#11 00010028 3BC00004 0001002C 3C600001 00010030 93C32348 >>> DEMO\#12 00010034 4800003D >>> DEMO\#13 00010038 38800005 0001003C 63C30000 00010040 48000051 00010044 3C800001 00010048 906424DC >>> DEMO\#14 0001004C 63E30000 00010050 48000061 >>> DEMO\#15 00010054 38600000 >>> DEMO\#16 00010058 8001001C 0001005C 7C0803A6 00010060 83C10010 00010064 83E10014 00010068 38210018 0001006C 4E800020 >>> DEMO\#17..20 addierenG: 00010070 3C600001 00010074 8063234C 00010078 3C800001 0001007C 80842348 00010080 7C632014 00010084 3C800001 00010088 906424DC >>> DEMO\#21 0001008C 4E800020 >>> DEMO\#22..24 addierenL: 00010090 9421FFF0 00010094 90610008 00010098 9081000C >>> DEMO\#25 0001009C 80610008 000100A0 8081000C 000100A4 7C632014 >>> DEMO\#26 000100A8 38210010 000100AC 4E800020 >>> DEMO\#27..29 fakultaet: 000100B0 9421FFE8 000100B4 90610008 >>> DEMO\#30 000100B8 38600001 000100BC 9061000C >>> DEMO\#31..32 000100C0 90610010 000100C4 80810008 mfspr stwu stw stw stw stw stw 0,LR 1,-24(1) 30,0x10(1) 31,0x14(1) 0,0x1c(1) 3,0x8(1) 4,0xc(1) addi addis stw 31,0,0x3 3,0,0x1 # 0x1234C hi(a) 31,0x234c(3) addi addis stw 30,0,0x4 3,0,0x1 # 0x12348 hi(_edata) 30,0x2348(3) bl addierenG addi ori bl addis stw 4,0,0x5 3,30,0x0 addierenL #0x00010090 4,0,0x1 # 0x124DC hi(summe) 3,0x24dc(4) ori bl 3,31,0x0 fakultaet addi 3,0,0x0 lwz mtspr lwz lwz addi bclr 0,0x1c(1) LR,0 30,0x10(1) 31,0x14(1) 1,1,0x18 0x14,0x0 addis lwz addis lwz addc addis stw 3,0,0x1 # 0x1234C hi(a) 3,0x234c(3) 4,0,0x1 # 0x12348 hi(_edata) 4,0x2348(4) 3,3,4 4,0,0x1 # 0x124DC hi(summe) 3,0x24dc(4) bclr 0x14,0x0 stwu stw stw 1,-16(1) 3,0x8(1) 4,0xc(1) lwz lwz addc 3,0x8(1) 4,0xc(1) 3,3,4 addi bclr 1,1,0x10 0x14,0x0 stwu stw 1,-24(1) 3,0x8(1) addi stw 3,0,0x1 3,0xc(1) stw lwz 3,0x10(1) 4,0x8(1) #0x00010070 #0x000100B0 52 000100C8 7C032000 000100CC 41810028 >>> DEMO\#33..34 000100D0 80610010 000100D4 8081000C 000100D8 7C8321D6 000100DC 9081000C >>> DEMO\#32 000100E0 30630001 000100E4 90610010 000100E8 80810008 000100EC 7C032000 000100F0 4081FFE0 >>> DEMO\#35..36 000100F4 38210018 000100F8 4E800020 cmp bc 0,0,3,4 0xc,0x1,fakultaet+0x44 lwz lwz mullw stw 3,0x10(1) 4,0xc(1) 4,3,4 4,0xc(1) addic stw lwz cmp bc 3,3,0x1 3,0x10(1) 4,0x8(1) 0,0,3,4 0x4,0x1,fakultaet+0x20 addi bclr 1,1,0x18 0x14,0x0 53 #0x000100F4 #0x000100D0