Seminar Moderne Prozessorarchitekturen
Transcription
Seminar Moderne Prozessorarchitekturen
Seminar Moderne Prozessorarchitekturen AG Systemsoftware und Verteilte Systeme Prof. Dr. P. Sturm Universität Trier Juni 1999 Inhaltsverzeichnis K APITEL 1 Intel Pentium und IA-64 Prozessor-Familien 1 Eric Johannes Martin Weber K APITEL 2 Geschichtliches 1 Das Konzept der Segmente 2 Die Seitenverwaltung (paging) 4 Sicherheitsmechanismen 5 Spekulative Ausführung (Out-Of-Order Processing) 6 Die MMX-Technologie. 7 Das Enhanced SIMD Streaming 8 Seriennummer gefällig ? 9 Die Intel Architektur 64 (IA-64) am Beispiel des ‚Itanium‘ 11 Literaturverweise 12 AMD K6/K7-Familie 13 Thomas Heinen K APITEL 3 Einführung: Die Geschichte der Firma AMD 13 “Historische” Prozessoren: AMD K5, K6, K6-2 und K6-III 14 3DNow! 15 Der Neue: AMD Athlon (a.k.a. K7) 16 Ausblick auf den AMD K8 (“Sledgehammer”) 20 Zusammenfassung 21 Quellenverzeichnis 22 PowerPC/MPC750 25 Oliver Fritzen PowerPC - Geschichte 25 Der Motorola MPC750 - technischer Aufbau 25 RISC 26 Aufbau und Arbeitsweise des MPC750-Prozessors 27 Weitere Features 30 Blick in die Zukunft 30 Verwendete Literatur: 31 Seminar Middleware: Betriebssysteme der Zukunft? iii Inhaltsverzeichnis K APITEL 4 Alpha-Prozessoren (21x64) 33 Jürgen Ballmann K APITEL 5 Designkriterien 33 Architektur 33 Befehlssatz 34 Adressraum 35 Prozessormodelle 35 Zusammenfassung 37 Literatur 38 Scalable Processor Architecture SPARC - Version 9 39 Alexander Greiml Historisches 39 Was ist SPARC 39 Die SPARC-Version 9 Architektur 40 Traps und Interrupts 43 Instruktionsformate und Instruktionen 45 Speichermodelle 46 Address Spaces 47 Referenz MMU 47 Sun UltraSPARC-2 48 Fujitsu/HAL SPARC64-GP 50 Vergleich Sun UltraSPARC-2 und Fujitsu/HAL SPARC64-GP 51 K APITEL 6 Appendix 52 Quellen 52 MIPS-Familie 53 Matthias Brust K APITEL 7 Die Firma MIPS 53 Der MIPS 10000 Prozessor 55 Ein Vergleich zum MIPS R12000 61 Quellenangaben 62 ARM & relatives 63 Heng Yiu Chau iv Ein wenig Historisches 63 Allgemeiner Aufbau eines ARM Prozessors 64 Aus ARM wird ARM 64 ARMs im Überblick 65 Seminar Middleware: Betriebssysteme der Zukunft? Thumb extension die Wiederanwendung des RISCprinzips auf ARMs RISCprozessor ? 66 ARM10 Thumb Das aktuelle ARM Modell 1020T mit Vector FPU 67 StrongARM-Reihe Digital´s ARM-Implementation 68 AMULET Forschung asynchroner Prozessoren auf Baszs von ARMs 69 Quellenverzeichnis 70 Seminar Middleware: Betriebssysteme der Zukunft? v Inhaltsverzeichnis vi Seminar Middleware: Betriebssysteme der Zukunft? Moderne Prozessorarchitekturen (ursprünglicher Aushang zur Seminarankündigung) Die Leistungsfähigkeit von Mikroprozessoren wird jährlich um ca. 30-50 % gesteigert. Das Fundament für diese enorme Steigerungsrate wird durch viele Facetten technischer Kunstgriffe gelegt. Begriffe wie Caching, Superpipelining, Superscalar Architectures, Branch Prediction und Out-of-order execution sind Beispiele aus der Trickkiste fortschrittlicher Prozessormanufakturen. Weiterhin erlauben immer höhere Intergationsdichten die Einbettung immer komplexerer und spezialisierterer Funktionalitäten direkt auf den Chips. Als Beispiel hierfür seien die Multimedia Extensions a.k.a. MMX, ISSE bzw. 3DNow! genannt. Ferner verspricht die 64-Bit Technologie einen erneuten Quantensprung sowohl aus Hardware- als auch aus Softwaresicht. Die Ergründung der Geheimnisse, die sich in den Gehäusen moderner Mikroprozessoren verstecken, bildet den Schwerpunkt dieses Seminars. Exemplarisch ausgewählte moderne Mikroprozessoren sollen analysiert und gegenübergestellt werden, so daß eine differenzierte Übersicht über die aktuellen Entwicklungen auf dem Gebiet moderner Prozessorarchitekturen entsteht. Im einzelnen sind folgende Vorträge geplant: • • • • • • • Intel Pentium-Familie AMD K6/K7-Familie Motorola PowerPC 750 / G4 DEC Alpha 21264 / 21364 Sun UltraSparc MIPS R10000 IA-64 Seminar Middleware: Betriebssysteme der Zukunft? vii viii Seminar Middleware: Betriebssysteme der Zukunft? K APITEL 1 Intel Pentium und IA-64 Prozessor-Familien Eric Johannes Martin Weber Geschichtliches Intel stellt bereits seit 1969 Mikroprozessoren her, die für die Intel Pentium Architektur interessante Produktreihe der 80x86 Prozessoren beginnt allerdings erst mit dem 8086 im Jahre 1978. Der 8086 war der erste Intel Prozessor mit Segment Unterstützung, allerdings handelte es sich hierbei jedoch noch um eine sehr frühe Form, die nur im ‚Real Adress-Mode‘ arbeitete also nur direkte Speicherpointer (keine Segmentdeskriptoren) verwenden konnte. Das sollte sich vier Jahre später (1982) mit dem 80286 schlagartig ändern, denn dieser Chip verfügte als erster Intel Prozessor über einen ‚Protected-Mode‘ (Vgl. “Sicherheitsmechanismen” S. 5) und war zudem noch in der Lage Speichermanagement auf Segmentebene (Segment-Swapping) sowie prozessorunterstützte Kontextwechsel (Hardware Task-Switching) durchzuführen. Um weiterhin im heiß umkämpften Prozessormarkt erfolgreich bestehen zu können erweiterte Intel 1985 seine Produktpalette um einen neuen Prozessortyp, die 32 Bit Architektur (IA-32), deren erster Vertreter der 80386 war. Wichtigstes Merkmal dieses Prozessors war die auf 32 Bit erweiterte Architektur, wodurch dem Anwender eine wesentlich größere Menge an Hardwareressourcen zur Verfügung stand, so z.B. ein Adreßraum von vier Gigabyte (statt der bisherigen 16 Megabyte). Damit einher ging auch die Notwendigkeit einer 16 Bit Emulation des 8086 (im sogenannten virtual 8086 mode) um die abwärts Kompatibilität zu gewährleisten ohne gleichzeitig auf den Performancegewinn der neuen Hardware verzichten zu müssen. Weiterhin hatten die Software-Entwickler jetzt erstmals die Möglichkeit den Speicher auch in einem ‚Flaches Adreßmodell‘ zu verwenden um so z.B. UNIX problemlos auch auf Intel Prozessoren implementieren zu können. Im Zuge der immer höheren Speicheranforderungen der Programme war es auch für Intel unausweichlich ein flexibleres virtuelles Speichermanagement bereit zu stellen, so das der 80386 der erste Intel-Prozessor mit der Möglichkeiten zur Seitenorientierten Speicherverwaltung (Vgl. “Die Seitenverwaltung (paging)” S. 4) - mit einer Seitengröße von vier Kilobyte - war. Zudem setzte man bei Intel zunehmend auf den performancesteigernden Aspekt des Parallelismus innerhalb des Prozessors, dieser Trend, der sich bis heute fortsetzt hat, wurde auch im Nachfolger des 80386, dem 80486, im Jahre 1989 konsequent weiter geführt. Die hierbei mit Abstand wichtigste Neuerung war die Einführung einer fünfstufigen Pipeline, aber auch die erstmalige Verwendung eines prozessorinternen Caches (acht Kilobyte first Level) und die (theoretische) Unterstützung einer weiteren Chacheebene (second Level) waren wichtige Meilensteine auf dem Weg zu höheren Geschwindigkeiten. Ein weitere wichtige Neuerung beim 80486 war die erstmalige Integration der Fließkommaeinheit (FPU) in den Prozessorkern, da hierdurch Seminar Moderne Prozessorarchitekturen 1 Intel Pentium und IA-64 Prozessor-Familien ihre Geschwindigkeit erhöht werden konnte (Cache Nutzung, interner Bus, ...). Man findet auch schon erste Ansätze zur Unterstützung von mehreren Prozessoren im 80486, diese Entwicklung sollte sich aber erst mit dem nächsten Mitglied der Intel Prozessorfamilie, den Intel Pentium Prozessor wirklich durchsetzen. Nach dem 80486 änderte Intel die Benennungsphilosophie seiner Prozessoren dahingehend, daß von nun an mehr mnemonische Namen für die Prozessoren verwendete, und so hießen die 32 Bit Nachfolger des 80486 Intel-Pentium, Celeron, ... und nicht einfach 80586 oder ähnlich. Der 1993 eingeführte Intel Pentium Prozessor stellt bezüglich des 80486 insbesondere im punkto Parallelismus eine Weiterentwicklung dar, er verfügt über eine ‚2-Way Superscalar Architecture‘. Das heißt er kann zwei Basis-Instruktionen in eine Takt ausführen, hierzu verfügt er über zwei unabhängige Pipelines. Neu war bei diesem Prozessor auch, daß nun auch Seiten mit vier Megabyte größe für das Paging zur Verfügung standen und daß der Chip nun über die Möglichkeiten der Sprungvorhersage (Branch Prediction) verfügte, was zu einer besseren Ausnutzung der Pipeline und somit zu einem allgemeinen Performancegewinn führte. Außerdem wurden nun tatsächlich zwei Prozessoren im Parallelbetrieb unterstützt (dual prozessor mode), so daß auch hier noch mal die Möglichkeit zu mehr Rechenpower gegeben war. Für den High-End Markt entwickelte Intel schon sehr bald eine verbesserte Version des Pentium Prozessors, den Pentium Pro. Genau betrachtet, sind die Veränderungen sogar derart groß, daß man bereits den Pentium Pro als Pentium II hätte verkaufen können, denn der Pentium Pro stellt den Beginn der Intel P6-Architektur dar, die unter anderem über Spekulative Ausführung (out of order processing) und einen 36 Bit Adreßbus verfügt. Doch der Pentium II ließ nicht lange auf sich warten (er erschien 1998) und stellte nun auch dem Heimanwender die neue P6-Architektur zur Verfügung (wenngleich auch der Speicherbustakt im vergleich zum Pentium Pro nicht mehr auf vollem Prozessortakt lief - dazu gab es ja dann wieder eine Profiversion, den Pentium II Xeon ...). Die Wichtigesten Neuerungen bestanden hier in der entgültigen Integration von MMX und der standardmäßigen Bereitstellung von Level zwei Cache außerdem war der PII jetzt ‚3-Way Superscalar‘ und die Funktionalität der FPU wurde ebenfalls erweitert. Für den Low-End PC-Markt wurde eine abgespeckte Version des Pentium II entwickelt, der Intel Celeron Prozessor, der über einen Pentium II Kern verfügt, dem aber alle Multiprozessor Features fehlen und der im allgemeinen als Chip (PPGA Technologie) und nicht mehr als Cartride (Slot 1) ausgeliefert wird. Mit dem bis jetzt jüngsten Mitglied der Intel Pentium Familie, dem Pentium III, kam auch noch ISSE (eine FP SIMD Technik) und eine Prozessorserienummer dazu, die derzeitige Version, der Pentium III Copermine, wurde darüber hinaus durch finetuning (insbesondere im Cachebereich) nochmals beschleunigt. Im September 1999 wurde der erste funktionsfähige Prototyp des IA-64 Chipsatzes von Intel vorgestellt, die Verkaufsbezeichnung wird ‚Itanium‘ sein (die Entwicklungsbezeichnung war ‚Merced‘). Im Folgenden wollen wir uns etwas näher mit der Intel P6-Architektur befassen: Das Konzept der Segmente Alle gängigen Intel-Prozessoren verfügen über sechs 16 Bit Segmentregister (eins für Code (CS), vier für Daten (DS, ES-GS) und eins für den Stack (SS)). Diese Register dienen dazu den physikalischen Arbeitsspeicher des Computers in voneinander getrennte Blöcke zu unterteilen und somit vor gegenseitiger Beeinflussung zu schützen. Die Segmentregister zeigen nicht direkt auf die betreffenden Speicherbereiche (außer beim 80286) sondern auf einen sogenannten Segmentdeskriptor in einer der beiden Segmenttabellen (prozeßlo- 2 Seminar Moderne Prozessorarchitekturen Das Konzept der Segmente kal: LDT, global: GDT), hierbei handelt es sich um eine Datenstruktur des Prozessors zur Segmentverwaltung, die im Wesentlichen die Basisadresse (32 Bit), sowie eine Größenbeschränkung (Limit 20 Bit entweder mit Granularität 0 (ein Megabyte in Byte schritten ) oder 1 (vier Gigabyte in vier Kilobyte Schritten)) des Segments und einige Informationen über die zugriffsrechte (DPL), den Type und den Zustand (Present/Not Present) enthält. Die Intel-Prozessorarchitektur ist so aufgebaut, daß immer über die Segmentregister auf den Speicher zugegriffen wird (direkte zugriffe sind nicht möglich). Will man also z.B. das unter UNIX gebräuchliche Flache Adreßmodell verwenden (und somit den direkten, segmentlosen Speicherzugriff simulieren), so muß man alle Segmentregister auf den gleichen Segmentdeskriptor (Basisadresse 0x0, Limit 0xFFFFFF, das heißt den gesamten (logischen) Adreßraum zeigen lassen, um somit effektiv die Segmentierung des Speichers zu umgehen. Vorgesehen ist jedoch die Verwendung von unterschiedlichen Segmentregistern, im sogenannten ‚Multisegment Mode‘, wo jeder Prozeß über eigene, in der Regel von einander getrennte Speicherbereiche verfügt, die über Prozeßlokale Deskriptor-Tabellen angesprochen werden. Das Register, das auf die Lokale Deskriptor Tabelle zeigt (LDTR) wird beim Hardwareunterstützten Kontextwechsel automatisch mit gesichert und das für den neuen Prozeß nötige in das LDTR geladen. Die Segmentregister selbst sind zweigeteilt, sie besitzen nämlich einen Sichtbaren und einen unsichtbaren Teil, der sichtbare Teil besteht lediglich aus einem 13 Bit Segment-Selektor (Bits 3-15 wird mit acht multipliziert als Offset in der Segmenttabelle verwendet), sowie einem Table-Indicator (Bit 2 0 = global, 1 = lokal) und einem Requested Priviledge Level (RPL, Bits 0,1: 0 = highest , 3 = lowest). Der unsichtbare Teil hingegen speichert die Daten aus der Segmenttabelle für dieses Segment zwischen, so daß der Prozessor ohne zusätzlichen Aufwand (Speicherzugriffe etc.) die gewünschte Speicheradresse bestimmen - beziehungsweise im Fall eines ungültigen Zugriffs eine Exception auslösen - kann. Segmentorientierte Speicherzugriffe sind nicht Transparent und müssen daher von der Anwendung und dem Betriebssystem unterstützt werden (sollen mehr als sechs Segmente verwendet werden, so besteht die Möglichkeit den Inhalt einzelner Segmentregister mit speziellen Befehlen (LCS, LDS, ...) den Sichtbaren Teil des Segmentregisters zu ändern, woraufhin der Prozessor den unsichtbaren Teil aus der entsprechenden Segmenttabelle nachlädt (oder im falle einer Zugriffsverletzung eine Exception auslöst). [1] Bild 1. Segmentauswertung Logical Address 31 15 0 Seg. Selector 0 Offset Descriptor Table Segment Descriptor Base Address + 31 0 Linear Address Werfen wir nun einen Blick auf ein weiteres Mittel der Prozessorunterstützten Speicherverwaltung in der Intel Architektur: Seminar Moderne Prozessorarchitekturen 3 Intel Pentium und IA-64 Prozessor-Familien Die Seitenverwaltung (paging) Beim Paging wird der Speicher nicht wie bei der Segmentierung in große zusammenhängende Stücke zerlegt, sondern in kleine Seiten mit einer Größe von vier Kilobyte oder vier Megabyte aufgeteilt (im 36 Bit Adreßmodus sind statt dessen zwei Megabyte Seitengröße möglich). Hierbei steht an der adressierten Speicherstelle (linear address) statt einer Adresse im physikalischen Speicher eine weiterer logische Adresse, welche sich aus drei Zeigern zusammensetzt. Zuerst kommt der Pointer auf das sogenannte ‚Page Directory‘, dann ein Zeiger auf die zugehörige Seitentabelle (Page Table) und letztendlich noch ein Offset, das die genaue Position auf der Seite angibt, die Größe der einzelnen Pointer hängt direkt von der verwendeten Seitengröße und dem zu verwaltenden Adreßraum (32 oder 36 Bit) ab: Bei 32 Bit und 4 Kilobyte Seiten ergibt sich: 10 Bit Directory, 10 Bit Tabelle und 12 Bit Offset. Für 32 Bit und 4 Megabyte Seiten erhält man: 10 Bit Directory, 0 Bit Tabelle und 22 Bit Offset. Für 36 Bit ist die Sache etwas komplizierter (und es gibt auch noch zwei arten 36 Bit Adressierung zu realisieren, doch glücklicherweise wird dieses Problem mit Einführung der 64 Bit Prozessoren einfach verschwinden). Hier also nun ein Beispiel für die gängige 36 Bit Adressierung mit vier Kilobyte Seitengröße. Zuerst muß ein zusätzlicher Pointer, der ‚Page Directory Pointer‘ (2 Bit), eingeführt werden um mit dem größeren Adreßraum zurecht kommen zu können. Dieser zeigt auf einen von vier Einträgen in der ‚Page Directory Pointer Table‘ (64 Bit, 36 used). Anschließend geht es wie gewohnt weiter: 9 Bit Page Directory, 9 Bit Page Table, und 12 Bit Offset (am Anfang stehen ja noch die zwei Bits für den Page Directory Pointer). Offensichtlich lassen sich hier auch jeweils nur 4 Gigabyte auf einmal ansprechen, der ganze Aufwand dient also lediglich dazu 36 Bit Basisadressen verwenden zu können. Um jetzt also auch 36 Bit physikalischen Speicher anzusprechen muß man den PDBR (Basispointer für die Page Directory Pointer Table (in Kontrollregister 3 (CR3)) ändern, was gleichbedeutend damit ist eine andere Seitentabelle zu verwenden und somit den kompletten Overhead (TLB flush etc.) mit sich bringt, alles in allem eine doch recht umständliche Sache. Die Seiten selbst (und auch die Seitentabellen, welche ja spezielle Seiten sind) verfügen über einige zusätzliche Bits in der jeweiligen Tabelle, die angeben ob auf die Seite zugegriffen, sie verändert wurde, ob ein Schreibschutz besteht und ganz wichtig, ob sich die Seite derzeit im Speicher befindet oder nicht. Ist eine Seite nicht im Speicher (Bit 0 = 0) dann stehen die restlichen Bits für Systeminformationen (über die derzeitige Position der Seite) zur Verfügung, ein Zugriff auf die Seite verursacht eine Exception, die wiederum (auf Betriebsystemebene) dazu genutzt werden sollte die Seite vom Hintergrundspeicher zu laden und dei Anweisung erneut auszuführen (ein Großteil der benötigten Funktionen wird von Intel in Hardware unterstützt). Im Gegensatz zur Segmentarchitektur ist das Pageing für die Anwendungsprogramme vollkommen transparent und wird völlig auf Betriebsystemebene realisiert. Zur Aktivierung des Paging dient übrigens Bit 31 im CR0 und die Basisadresse der Seitentabelle steht im CR3 (PDBR). Auch für die Seitenverwaltung ist es möglich jedem Task eine eigene Pagetable zu geben oder nur eine einzige für das gesamte System zu verwenden (allerdings ist hier nur ein Register vorhanden, so daß normalerweise nur eine der beiden Möglichkeiten gegeben ist. [2] [3] 4 Seminar Moderne Prozessorarchitekturen Sicherheitsmechanismen Bild 2. Erweiterte Seitenverwaltung (36 Bit) Linear Address 31 30 Directory Pointer 21 Directory 12 Table 0 Offset 12 Page Directory 9 Page Table 4-KByte Page Physical Address 9 Page-Table Entry 2 Directory Entry Page-DirectoryPointer Table Dir. Pointer Entry 32 CR3 (PDBR) Ein modernes Betriebssystem benötigt Möglichkeiten verschiedene Zugriffsrechte zu verwenden um einen stabilen Betrieb gewährleisten zu können, hierzu bietet Intel in seinen Prozessoren unter anderem folgende Möglichkeiten an: Sicherheitsmechanismen Wie bereits erwähnt gibt es sowohl auf Segment-, als auch auf Seitenebene die Möglichkeit den Zugriff auf den entsprechenden Speicherbereich zu Reglementieren. Auf Segmentebene greift hier diesmal der kompliziertere Mechanismus mit insgesamt vier verschiedenen Sicherheitsstufen (von 0 (hoch) bis 3 (niedrig)). Wohingegen auf Seitenebene nur zwei Sicherheitsstufen möglich sind (User- und SupervisorMode), außerdem läßt sich für jede Seite mittels eines Bits noch festlegen, ob diese nur lesbar sein soll (WP=1) oder ob auch schreibend darauf zugriffen werden darf. Ob im Supervisor-Modus das Write-Protect Bit beachtet werden soll kann im Kontrollregister 0 (CR0) mit dem WP (WriteProtection) Bit festgelegt werden. Damit der Seitenbasierte Schutz überhaupt greifen kann sind die Seitentabelle (pagetable) und der Seitentabllendeskriptor (pagetable descriptor) ausschließlich im Supervisor-Modus zugreifbar. Natürlich gibt es auch eine Reihe von Befehlen, die nur im Supervisor-Modus ausgeführt werden können dazu gehören z.B. alle Befehle, die auf wichtige Prozessorstrukturen zugreifen (Kontrollregister, PSW, Segment/Seitenverwaltung ...), da sich hier sonst eine Möglichkeit der Umgehung der Sicherheitsmechanismen bieten würde. Beim Sicherheitsmechanismus auf Segmentebene werden jede Menge von Tests durchgeführt (allerdings alle parallel zur Adreßberechung und somit ohne zusätzlichen Zeitaufwand), die sicherstellen, daß Segmente nicht unerlaubt verändert oder geladen werden. Für eine ausführliche Darstellung fehlt hier leider der Platz, doch im Prinzip funktioniert der Schutz in fünf Stufen: Seminar Moderne Prozessorarchitekturen 5 Intel Pentium und IA-64 Prozessor-Familien 1. Typ checks (z.B. muß ein Code Segment in CS as executable gekennzeichnet sein, Stack Segmente müssen schreibbar sein ...). 2. Limit checks (zugriffe oberhalb (oder unterhalb falls expand down aktiv ist) des Limits sind unzulässig). 3. Beschränkung der Domäne (besteht die Berechtigung ein Segment zu ändern, ist der Zugriff erlaubt (unter Beachtung von CPL, DPL und RPL) 4. Beschränkung von Prozedur zugriffen (ist der Sprung in ein anderes Segment erlaubt ?, ...). 5. Beschränkung des Instruktionssatzes (einige Befehle dürfen nur mit Priviledgelevel 0 ausgeführt werden (z.B. HLT, Change CRs, ... und bestimmte I/O-Operationen haben eine eigenes Schutzsystem (IOPL in EFLAGS) um den Zugriff auf diese zu reglementieren) Erst wenn alle Stufen erfolgreich durchlaufen wurden kann der Zugriff erfolgen (und im falle eines Befehls dieser ausgeführt werden). Da normalerweise sowohl Segmente, als auch Seiten verwendet werden ist es wichtig zu wissen, daß immer zuerst die Zugriffsrechte für die Segmente überprüft werden und erst, wenn dieser Zugriff zulässig ist eine Prüfung auf Seitenebene erfolg, ist auch der Zugriff erlaubt, so wird die Aktion ausgeführt, anderenfalls wird eine Exception (Protection-Violation) ausgelöst - und somit der Zugriff abgebrochen. [4] Nun soviel zu den grundlegenden Speicherzugriffsmechanismen, wenden wir und jetzt also der eigentlichen Befehlsausführung zu. Spekulative Ausführung (Out-Of-Order Processing) Seit dem Pentium-Pro (1995) wird diese Technik in allen P6-Prozessoren verwendet. Die Grundidee beim OOP ist die, daß der Prozessor die Ausführungsreihenfolge der Instruktionen so abändern kann, daß möglichst wenige Pausen (stalls) durch belegte Hardwareressourcen und Zugriffsverzögerungen entstehen. Natürlich müssen die Befehle in genau der Reihenfolge für das System sichtbar werden, wie sie ursprünglich Programmiert wurden, da sonst eine korrekte Abarbeitung des Programmes nicht mehr gewährleistet werden kann. Die einfachste Lösung dieses Problems ist die Einführung von Aliasregistern, also solcher Register, die den Platz von bestimmten Prozessorregistern einnehmen und sozusagen als Puffer während der Ausführung dienen. Außerdem müssen die nächsten Befehle (bei den heutigen Intel Prozessoren etwa 20 bis 30) in einem speziellen Speicher abgelegt werden (dem sogenannten ReOrder Buffer), so daß die Ausführungseinheit (Execute/Dispatch Unit) auf diese nach Inhalt zugreifen kann (context adressable memory). Der ganze Prozeß läuft dann etwa wie folgt ab: 1. Fetch Instructions (from L1, L2 Cache or RAM) 2. Decode Instructions (fetch decode unit), max 3 per cycle 3. Put Instruction in Reorder Buffer (ROB) if ROB not full else stall 4. Dispatch / Execute instruction from ROB, get data as needed, max 5 per cycle (3 typical) 5. Retire finished instructions from ROB (max. 3 per cycle) Selbstverständlich werden so viele dieser Aktionen wie möglich parallel ausgeführt, hierzu dient unter anderem auch die zwölfstufige Pipeline. Es ergeben sich nun aber zwei Probleme: Erstens funktioniert die Ausführung von Befehlen, die erst später in der Programmausführung an der Reihe wären nur dann, wenn es sich nicht um schreibende Speicherzugriffe handelt (diese können nicht ohne inakzeptablen Overhead wieder rückgängig gemacht werden, falls die Instruktion aus irgendeinem Grund doch nicht ausgeführt werden darf); Zweitens bereiten bedingte Sprünge Schwierigkeiten, da das Sprungziel von einer noch nicht ausgewerteten Anweisung abhängen kann (und dies ist oft der fall, da die Umsortierung der Befehle die Kernidee der Spekulativen Ausführung ist). Das 6 Seminar Moderne Prozessorarchitekturen Die MMX-Technologie. Sprungziel muß also (probabilistisch) vorhergesagt werden, stellt sich diese Vorhersage später (nach Berechnung der Bedingung) als falsch heraus, so müssen alle Befehle, die ab dem vorhergesagten Sprungziel bereits ausgeführt wurden als ungültig markiert und aus dem Reorder Buffer entfernt werden. Wie man sieht hängt ein großer Teil des Performance Gewinnes an der korrekten vorhersage von Sprüngen, und so verwundert es nicht, daß Intel ständig versucht die Sprungvorhersage (branch prediction) in seinen Prozessoren zu verbessern (bei der P6-Familie heißt das ganze ‚advanced branch prediction‘ und der ‚Branch Taget Buffer‘ (BTB) hat 512 Einträge zum speichern von Sprungzielen). Eine Interessante Entwicklung zeichnet sich übrigens mit der IA-64 Architektur ab, denn hier wird jetzt ganz auf Prozessor gestützte OOP verzichtet (die Pipeline ist komplett in-order) satt dessen wird die Verantwortung für die Parallelität auf den Programmierer/Compiler übertragen (Vgl. “Die Intel Architektur 64 (IA-64) am Beispiel des ‚Itanium‘” S. 11). [5] Bild 3. Schema des out-of-order Processing und der Reservation Station MMX™ Execution Unit Floating-Point Execution Unit L2 Cache System Bus Port 0 Bus Interface Unit Reservatio Station To/From Instruction Pool (ReOrder Buffer) L1 ICache Fetch Fetch/ Decode Unit WIRE (Misc. Func.) Integer Execution Unit MMX Shuffle (ISSE) Execution Unit Jump PFADD (ISSE) Execution Unit Recip / Recipsqrt Port 1 Integer Execution Unit Port 2 Load Unit Loads Port 3, 4 Store Unit Stores L1 DCache Load Dispatch/ Execute Unit Store Retire Unit Instruction Pool Da in der heutigen Zeit die Rechner verstärkt für Multimedia Anwendungen (insbesondere für Spiele) genutzt werden, hat Intel sich einige Methoden zur Beschleunigung solcher Anwendungen einfallen lassen. Die Erste und Älteste ist: Die MMX-Technologie. Seit Einführung des Pentium-MMX baut Intel diese Erweiterung des Befehlssatzes (57 Befehle mehr) in alle Prozessoren der P6-Reihe ein. Im Gegensatz zu anderen Techniken wie z.B. dem ISSE (Vgl. “Das Enhanced SIMD Streaming” S. 8) ist MMX keine neue Prozessorhardware im eigentlichen Sinn, sondern vielmehr eine Erweiterung der FPU Funktionalität. Die Aufgabe des MMX-Instruktionssatzes besteht in der Verarbeitung von Multimediadaten (MMX = Multi Media eXtension), für Intel waren damals Multimediadaten kleine (vorzeichenbehaftete) Integerwerte gleichen Typs. Die Idee der MMX-Technologie besteht nun einfach darin jeweils einige dieser Daten zu einem 64Bit Paket zusammenzufassen und parallel auf diesen 64-Bit mehrere gleiche Operation durchzuführen (wie add, mult, ...) und dadurch die Verarbeitungsgeschwindigkeit zu erhöhen (Single Instruction Multiple Data - SIMD). In der Praxis hat sich dieses Konzept als durchaus brauchbar erwiesen, Seminar Moderne Prozessorarchitekturen 7 Intel Pentium und IA-64 Prozessor-Familien insbesondere deshalb, da durch die Verwendung des FPU Registerstacks keine Änderungen an bestehenden Betriessystemen vorgenommen werden müssen (denn der Zustand der FPU-Register wird beim Kontextwechsel bereits gesichert). Durch diesen Trick konnte eine problemlose Integration in bestehende Systeme ermöglicht werden, es ergibt sich jedoch sofort folgendes Problem: Es ist nicht möglich MMX und FPU Instruktionen parallel zu nutzen, schlimmer noch, da die MMX-Technologie über keine eigenen Register verfügt ist sogar eine Mischung von MMX und FPU Operationen unmöglich (das FPU-Statusregister würde falsche Informationen enthalten und Registerinhalte würden überschrieben !). Hieraus folgt ein nicht unerheblicher Overhead für das Speichern und Restaurieren des FPU-Statuswortes und eventueller Registerinhalte vor und nach jedem Wechsel von FPU beziehungsweise MMX Operationen. Die vier MMX Datentypen sind, wie auch die Befehle, sehr einfach aufgebaut: Ein Quadword (64 Bit) wird entweder in 8x8, 4x16, 2x32 oder 1x64 Bit aufgeteilt. Der Instruktionssatz verfügt nun für jeden dieser Typen über einen passenden Befehl um z.B. eine parallele Addition auszuführen. Um die Befehle einfach und effizient (und kompatible zur FPU Architektur) zu halten arbeitet der Instruktionssatz Registerstack orientiert und explizite Angaben der Operanden sind nur bei der Datenkonvertierung (pack, unpack) und dem Speichertransfer möglich, in allen anderen Fällen sind sie implizit über den Stack gegeben. Hauptanwendungsgebiet ist die Sound- und Bildverarbeitung, wo MMX taugliche Datenformate (8/16 Bit Samples, 8/16/32 Bit Pixel) in großen Mengen ähnlichen Operationen unterworfen werden (Pegelanpassung, Alphablending usw.). [6] Beispiele: a) PMADDWD (16 x 16 Bit to 32 Bit Multiply-Add) a3 a2 a1 a0 * * * * b3 b2 b1 b0 -----------------------a3*b3+a2*b2 | a1*b1+a0*b0 b) PCMPGT[W] (16 Bit parallel Compare, es werden keine Condion-Codes gesetzt, sondern ein Ergebnisvektor geliefert) 32 16 12 34 gt? gt? gt? gt? 45 9 12 67 ---------------------0000 ffff 0000 0000 Intels nächste Multimediaerweiterung war: Das Enhanced SIMD Streaming Diese unter dem Schlagwort Internet Straming SIMD Extension (ISSE) vermarktete Erweiterung der Intel Prozessoren beginnend mit dem Pentium III stellt sozusagen die konsequente Umsetzung der MMX-Idee auf Fließkommadatentypen dar. Mit 70 neuen Befehlen und acht eigenen 128 Bit (ISSE) Registern, welche im Gegensatz zu MMX nicht als Stack aufgebaut sind, ist diese Erweiterung um einiges umfangreicher als MMX und führt damit auch zu einer zehnprozentigen Vergrößerung der benötigten Chipfläche. 8 Seminar Moderne Prozessorarchitekturen Seriennummer gefällig ? Der wichtigste Unterschied zur MMX Philosophie ist sicherlich der Verzicht auf eine transparente Einbindung der neuen Hardwarefunktionalität in bestehende Betriebssysteme (es ist die erste Änderung am Prozessorstatus seit Anpassung der FPU im 80386 / 80387). Durch die neuen Register und Interupts ist für die Nutzung der ISSE-Funktionalität eine Unterstützung durch das Betriessystem zwingend notwendig (die ISSE-Register könnten sonst nach Kontextwechsel ungesichert überschrieben werden), allerdings hat Intel durch die Einführung neuer state sore/restore Befehle die Integration sehr einfach gestaltet. Der Vorteil dieser Designentscheidung liegt allerdings ebenso klar auf der Hand: ISSE kann problemlos parallel zu MMX und zur FPU genutzt werden (wenngleich einige FPU execution units bei ISSE Verwendung finden und somit eine wirklich zeitgleiche parallel Ausführung von ISSE und FPU Instruktionen in einzelnen Fällen eingeschränkt sein kann). Internet SSE arbeitet ausschließlich mit single precision Floats (32 Bit) und kann somit in einem Register vier Daten gleichzeitig verarbeiten, wobei die 128 Bit Befehle zur Ausführung in zwei 64 Bit Mikroinstruktionen aufgeteilt werden, so daß nur dann ein Zyklus pro 128 Bit Instruktion ausreicht, wenn unterschiedliche Ausführungseinheiten verwendet werden können (wie z.B. beim multiply-add), ansonsten werden zwei Zyklen für 128 Bit benötigt. Auch die Verwendung skalarer Werte (einzelner 32 Bit Floats) ist möglich, um den Overhead so gering wie möglich zu halten und eine Verstopfung der Pipeline mit unnötigen Operationen zu vermeiden wurden hierfür spezielle Instruktionen eingeführt, die nur die unteren 32 Bit bearbeiten und die restlichen 96 Bit einfach ins Zielregister durchkopieren (somit ist immer eine Mikroinstruktion ausreichend). Da ISSE hauptsächlich für die Anwendung im 3D-Grafik und Videobereich, sowie für die Spracherkennung entwickelt wurde verwundert es nicht, daß hierbei die Geschwindigkeit im Vordergrund stand. So gibt es z.B. die Möglichkeit statt der IEEE Fließkommaberechnung den weniger präzisen, aber schnelleren ‚Flush to Zero‘ Modus (runden zu 0, underflow = 0) zu verwenden und für besonders Zeitkritische Anwendungen steht sogar noch eine auf Tabellen bestehende Berechnung von 1/ Wurzel und Kehrwerten (1/x) zur Verfügung (RCP, RSQRT - recht grobe Mantisse: 12 statt 24 Bit). Außerdem ist es möglich, die komplette Fehlerbehandlung über die Hardware ablaufen zu lassen (im Fehlerfall Vorgabewerte einsetzen, statt Exceptions auszulösen und einfach weiter rechnen). Eine weitere Neuerung des ISSE ist der Streaming Teil, der es ermöglicht Speicherzugriffe im Hintergrund ablaufen zu lassen (sollte zu früh auf die beantragten Daten zugegriffen werden kommt es zu stalls, bis die Daten da sind). In jedem fall kann die Retirement Unit den Speicherzugriffs-Befehl sofort als abgearbeitet betrachten und braucht nicht erst auf das Eintreffen der Daten zu warten (Prefetch). Ein weiteres straming Feature ist die Möglichkeit anzugeben, ob die Daten in den Cache aufgenommen werden sollen oder nicht, bei großen Datenströmen mit einmaligen zugriff auf die einzelnen Daten kann es durchaus sinnvoller sein den Cache für wichtige lokale Variablen (Matrizen od. ä.) frei zu halten statt ihn mit unnützen Daten vollzustopfen. [7] Im Zuge von Internet und E-Comerce Anwendungen taten sich immer wieder neue Sicherheitslükken auf, was uns zu der Frage führt: Seriennummer gefällig ? Mit Einführung es Pentium III erweiterte Intel seine Prozessoren um die Prozessoridentifikationsnummer (auch Seriennummer genannt). Dieses Feature soll dem Anwender zu mehr Sicherheit im Internet verhelfen, indem die Seriennummer des Prozessors bei der Authentifikation des Benutzers eines Internetdienstes mit einfließt. Soweit so gut, aber es ergeben sich auch eine einige Risiken, so z.B. die Möglichkeit sich in das System des Anwenders einzuhacken, indem man vorgibt die Identität des Rechners (z.B. vermittels Seminar Moderne Prozessorarchitekturen 9 Intel Pentium und IA-64 Prozessor-Familien eines Java-Programmes) abfragen zu wollen und statt dessen einen Virus oder ähnliches in das System einschleust. Allerdings ist auf anderen Plattformen (unter anderem auf SGI Workstations) ist die Verwendung von Prozessornummern schon lange ein zuverlässiges Mittel des Softwarekopierschutzes, einer weiteren interessanten Anwendung von Prozessorauthentifikation (insbesondere in Kombination mit Netzwerklizenzen usw.). Von technischer Seite betrachtet handelt es sich bei der Prozessorseriennummer um eine Erweiterung des CPUID Befehls, der dazu dient Prozessorspezifische Informationen (wie z.B. Prozessortyp oder unterstützte Features (MMX,...)) in Erfahrung zu bringen. Die Seriennummer selbst ist eine 96-Bit Zahl, die sich aus zwei Teilen zusammensetzt: Erstens der 32 Bit Prozessorsignatur (die den (allgemeinen) Typ der CPU spezifiziert) und zweitens aus einer 64 Bit Zahl die diesen speziellen Prozessor kennzeichnet. Interesannterweise findet sich in der Dokumentation der Prozessorseriennummer ein Vermerk, daß die Eindeutigkeit dieser Nummer nicht garantiert werden kann (insbesondere nicht in übertakteten oder unzureichend gekühlten Systemen) und daß deshalb durch Randbedingungen eine eindeutige Bestimmung des Rechners gewährleistet werden müsse. Besonders bemerkenswert (und vom Marketingstandpunkt aus betrachtet geschickt) ist die Möglichkeit die Seriennummer auszuschalten und dem Anwender doch wieder die Möglichkeit der (vermeintlichen) Anonymität im Netz zu geben (man denke hier nur an die eindeutige Nummer von Ethernetkarten oder ähnlicher, versteckter Hardware-Identifizierungsmerkmale!). Die Deaktivierung erfolgt über ein write once Bit, so daß zur erneuten Aktivierung der Serienummerabfragemöglichkeit ein Prozessorreset erforderlich ist (hierzu ist im Allgemeinen ein Neustart des Rechners notwendig). [8] Hier noch ein paar nützliche Beispiele zur P3-Seriennummer: Erkennen der Seriennummerunterstützung: MOV EAX, 01H// Parameter für CPUID CPUID BT EDX, 18// Bit 18 des EDX Registers überprüfen JC ...// Und falls dementsprechend weiter machen ... Auslesen der P3-Seriennummer: MOV EAX, 01H CPUID// Prozessor Signatur laden MOV dst+64, EAX// Erg. irgendwo abspeichern MOV EAX, 03H CPUID// Untere 64-Bit der Nummer MOV dst, ECX MOV dst+32, EDX// Ergebnisse speichern. // (dst = Zieladresse der Daten) Abschalten der P3-Seriennummer: MOV ECX, 119H// BBL_CR_CTL auswählen RDMSR// MSR 119H OR EAX, 0020 0000H// Bit 21 des EAX Registers setzen WRMSR// Änderung speichern Zum Abschluß noch ein Ausblick in die Zukunft: 10 Seminar Moderne Prozessorarchitekturen Die Intel Architektur 64 (IA-64) am Beispiel des ‚Itanium‘ Die Intel Architektur 64 (IA-64) am Beispiel des ‚Itanium‘ Nach nunmehr fast 15 Jahren 32 Bit Architektur bei Intel wird es höchste Zeit für den nächsten Schritt, die 64 Bit Architektur. Erster Chip dieser neuen Architektur wird der Itanium (Arbeitsbezeichnung Merced) sein, kürzlich (September 1999) wurde der erste funktionsfähige Prototyp der Öffentlichkeit vorgeführt, die Markteinführung ist für den Sommer 2000 zu erwarten. [9] Was ist also so besonderes an diesem neuen Chip? Außer der komplett auf 64 Bit ausgelegten Architektur sind folgende Punkte in der IA-64 Architektur festgelegt: • Volle Kompatibilität zur alten IA-32 Architektur (ausschließlich vermittels Emulation im 32 Bit Modus) • Statt der bis jetzt üblichen zwei Chachestufen werden es nun drei sein (Level 3 voraussichtlich etwa vier Megabyte). • Die Seitengröße kann bis zu 256 MB pro Seite betragen womit der größeren Speicherkapazitäten Rechnung getragen wird. • In den Prozessor wird ein PCI-Bus Controller eingebaut sein, welcher um bessere Ausfalltoleranz des gesamt Systems zu ermöglichen als hot swappable ausgelegt ist (Geräte können während des Betriebs ausgetauscht werden). • Der 64 Bit Befehlssatz ist Registerorientiert, hierfür wurde die Anzahl der verfügbaren Register drastisch erhöht (es gibt nun 128 Generl Purpose (64 Bit), 128 Floating point (82 Bit), 8 Branch (64 Bit) und 64 Predicate (1 Bit) Register). • Erweiterte Unterstützung von explizitem Parallelismus wie z.B. Speculation (d.h. Daten so früh wie möglich zu laden um sie dann bei Bedarf sofort zur Verfügung zu haben), Predication (eine raffinierte Methode zur Sprungvermeidung) • Es wird kein out-of-order processing mehr geben, dafür wird der dadurch gewonnene Platz auf dem Chip für zusätzliche Ausführungseinheiten verwendet werden. Gleichzeitig wird im Instruktionssatz (64 Bit Modus) ein impliziter Parallelismus vorgesehen, so daß die Entwickler gezwungen sind explizit parallel zu programmieren und nicht parallel ausführbare stellen im Quellcode zu kennzeichnen (natürlich wird das bald schon von den Compilern erledigt werden). • Der Itanium wird wohl folgende Ausführungseinheiten besitzen: Vier Integer, vier MMX, zwei FPU (erweitert, so daß vier single precision (32 Bit) Instruktionen bearbeitet werden können), zwei Load/Store-Units. • Die Decode Einheit wird sechs Instruktionen pro Takt dekodieren können, hieraus ergibt sich bei einer zehnstufige Pipeline: Ein FP-Durchsatz von 12 Operationen pro Takt (20 bei single precision) - ohne FP Verarbeitung sind noch 8 Operationen möglich. • Angestrebter Takt zum Einführungszeitpunkt: 900 Megahertz • Sowie eine weiter verbesserte (was immer das heißen mag) Vorhersage von nicht vermeidbaren Sprüngen (advanced branch prediction). • Selbstverständlich hat Intel auch wieder eine Erweiterung der SIMD Techniken (MMX und ISSE) integriert um Multimedia Anwendungen bestmöglich zu unterstützen :) Ein Beispiel für Predication (Pseudocode) C: if (a) { b = c + d; } if (e) { h = i - j; } ASM-IA64: cmp.ne p1,p2=a,r0// p1 <- a != 0 cmp.ne p3,p4=e,r0;;// p3 <- e != 0 // „;;“ = ende eines parallelen blockes (p1) add b=c,d// if a!=0 add (mit predicate register) (p3) sub h=i,j// if e!=0 sub (mit predicate register) Seminar Moderne Prozessorarchitekturen 11 Intel Pentium und IA-64 Prozessor-Familien (enthält keine Sprünge (also auch keine brabch prediction) sondern nur bedingte Befehle und benötigt nur zwei takte) ASM-IA32: L0: ... CMP a,r0 JZ L1 ADD b=c,d L1: CMP e,r0 JZ L2 SUB h=i,j L2: ... (herkömmliche IA-32 Version, enthält zwei Sprünge und benötigt gegebenenfalls wesentlich mehr Takte (bei falscher branch prediction)) Literaturverweise 1. Pentium®Processor Family Developer’s Manual - Volume 3: Architecture and Programming Manual, Chapter 11 2. Intel Architecture Software Developer’s Manual, Volume 3: System Programming Guide, Chapter 3.6 ... 3. Intel Architecture Software Developer’s Manual, Volume 3: System Programming Guide, Chapter 3.8 ... 4. Pentium®Processor Family Developer’s Manual - Volume 3: Architecture and Programming Manual, Chapter 12 5. Intel Architecture Software Developer’s Manual, Volume 1: Basic Architecture 6. Intel MMX Technology Overview 7. Internet Streaming SIMD Extension (Intel Tech. Journal Q2 1999) 8. Application Note: Intel® Processor Serial Number Pentium® III Processor Serial Number Feature and Applications (Intel Technology Journal Q2, 1999) 9. [9] IA-64 Application Developer’s Architecture Guide IA-64 Architecture Inovations (23 September 1999) Intel® Itanium™ Processor Microarchitecture Overwiew. Weitere Literatur: Intels Developement Website: developer.intel.com Intel Architecture Software Developer’s Manual, Volume 1: Basic Architecture Intel Architecture Software Developer’s Manual, Volume 3: System Programming Guide Datasheets zu P1, PPro, P2 (Xeon), P3 (Xeon), Celerons Pentium Processor Family Developer’s Manual Volume 3: Architecture and Programming Guide P6 Family of Processors - Hardware Developer’s Manual 12 Seminar Moderne Prozessorarchitekturen K APITEL 2 AMD K6/K7-Familie Thomas Heinen Einführung: Die Geschichte der Firma AMD1 Am 1. Mai 1969 wurde die Firma AMD (“Advanced Micro Devices”) gegründet. Zunächst befand sich das Hauptquartier der Firma im Wohnzimmer von John Carey, einem der Mitbegründer der Firma. Später mietete die Firma zwei Zimmer im Hinterhof einer Teppichfabrik in Santa Clara an. Im September konnte man sich schließlich ein Bürogebäude leisten, und die Produktion, die hauptsächlich aus verbesserten Produkten anderer Firmen bestand, lief endlich an. Im November wurde der Am9300 vorgestellt. Im Jahr 1970 präsentierte man der Öffentlichkeit den Am2501, den ersten proprietären Chip der Firma AMD. 1974 zählte AMD bereits 1.500 Angestellte und man hatte eine Produktpalette von über 200 verschiedenen Artikeln. Der Umsatz betrug bereits circa 26,5 Millionen Dollar. Anläßlich des fünften Firmenjubiläums veranstaltete die Firmenleitung eine Gala-Party für alle Angestellten sowie deren Familienangehörige, was sich zu einer gern gepflegten Tradition entwickelte. Im Jahre 1976 schlossen AMD und die Intel Corporation ein Patent-Abkommen und 1982 ein “Technology Exchange Agreement” die iAPX86-Familie betreffend. Noch arbeiteten die beiden Firmen in der Forschung zusammen. 1981 verwendete die NASA AMD-Chips an Bord des Space-Shuttles - ein großer Erfolg für AMD, der gute Zeiten für die Firma einläutete. Zum 15. Jubiläum im Jahre 1984, welches das erfolgreichste Jahr der Firmengeschichte darstellte, gab es erneut ein großes Fest, zu dem man die bekannte Musikgruppe “Chicago” einlud. Allerdings sollte dieser Erfolg nicht lange anhalten. 1986 wurde AMD von einer Krise, verursacht durch die aufkommende Konkurrenz aus Japan, geschüttelt. Neue Märkte mußten gefunden werden! Daher konzentrierte man sich 1989 unter anderem auf Mikroprozessoren, die kompatibel zu IBM-Computern sind. Man tätigte große Investitionen im Bereich der Forschung. So entstand beispielsweise das “Submicron Development Centre” in dieser Zeit. Dies alles geschah allerdings nicht ohne Probleme. Intel verklagte AMD, um den Vertrieb des Am386 zu verhindern, doch 1991 wurde AMD nach einem langen Prozeß Recht gegeben. 1. [AMD 1998a] Seminar Moderne Prozessorarchitekturen 13 AMD K6/K7-Familie 1993 war der Am486 auf dem Markt und man schloß einen Exklusivvertrag mit Compaq/Digital, so daß alle Compaqrechner mit AMD-Prozessoren ausgestattet wurden. 1997 erschien der K6 mit MMX-Unterstützung, 1998 folgten der K6-2 und der K6-III mit 3DNow!. “Historische” Prozessoren: AMD K5, K6, K6-2 und K6-III Die K5-Familie2 Der K5, von der Technologie her vergleichbar mit Intels PentiumProzessor, ist ein Prozessor der fünften Generation. Er ist superskalar und RISC-basiert, d.h. er kann mehrere Operationen gleichzeitig ausführen und verfügt über einen reduzierten Instruktionssatz (“Reduced Instruction Set Code”). Darüberhinaus ist schon out-of-orderexecution möglich, das heißt die Instruktionen müssen nicht in ihrer eigentlichen Reihenfolge abgearbeitet werden. Die K6-Familie3 4 5 6 7 8 Die Prozessoren der K6-Reihe sind alle vergleichbar mit Intels Pentium-2, Pentium Pro, Celeron bzw. Pentium-III. Alle diese sind Prozessoren der sechsten Generation. Im wesentlichen wurde das Cache-Verhalten verbessert und der Instruktionssatz gegenüber dem K5 modernisiert. Die größte Neuerung stellen die 3DNow!-Befehle dar. Weiterhin wurde die alte Architektur durch die Einführung des Super 7-Sokkels erweitert. Dieser unterstützt bis zu 100 MHz Bustakt sowie AGP2X. Außerdem hat man durch Integration des Level-2-Caches auf dem Prozessor einen Level-3Cache auf dem Mainboard zur Verfügung, der die Leistung weiter steigert. So verfügt der K6-III über 32K L1-, 32K L2- und 256K L3-Cache bei vollem Takt. Allerdings haben AMDs Prozessoren der K6-Familie eine schlechte Fließkommarechenleistung, die eher der von Prozessoren der fünften Generation entspricht. 2. 3. 4. 5. 6. 7. 8. [AMD 1998b] [Pabst 1998] [Pabst 1999a] [Pabst 1999b] [Neal 1999] [IXBT-LABS 1999] [PAIRNET 1999a] 14 Seminar Moderne Prozessorarchitekturen 3DNow! 3DNow! 3DNow! vs. MMX - Ein Überblick9 Die beiden von AMD bzw. Intel vorgestellten Instruktionssätze 3DNow! bzw. MMX sind im Prinzip ganz verschiedene Technologien, die aber über ähnliches Encoding verfügen und Simultaneous Instruction Execution unterstützen. MMX ist eher für integer-intensive Operationen nützlich, etwa für 2D-Graphik-Rendering, denn MMX besitzt keinerlei optimierte Fließkomma-Operationen. Zudem ist die gleichzeitige Nutzung von MMX und der FPU nicht möglich. 3DNow! dagegen ist explizit für fließkomma-intensive Berechnungen entwickelt worden, etwa für 3D-Graphik- und Multimedia-Anwendungen. Intel versucht diesen Rückstand mit dem Pentium-III aufzuholen, bei welchem ISSE (Internet Streaming SIMD Extensions bzw. ehemals KNI (Katmai New Instructions) genannt) eingeführt wurde, das über ähnliche Features wie 3DNow! verfügt.10 3DNow! näher betrachtet AMD stellte der Weltöffentlichkeit 3DNow! am 28. Mai 1998 vor.11 Diese Instruktionen werden von AMDs Prozessoren K6-2, K6-III, Athlon (“K7”) und den Fremdprodukten IDT “Winchip2” sowie Cyrix “Jalapeno” unterstützt.12 3DNow! erweitert die Prozessor-Mikroarchitektur um 21 SIMD (Single Instruction Multiple Data) Operationen, welche teils für Integer-, teils für Fließkommaberechnungen zuständig sind. Beispielsweise gibt es spezielle Integeroperationen für schnelle MPEG-Dekodierung. Desweiteren verfügen 3DNow!-unterstützende Prozessoren über zwei parallele vollständig gepipelinete Ausführungseinheiten (fully pipelined dual execution resources) für 3DNow!, so daß bis zu 2 3DNow!-Instruktionen pro Clock ausgeführt werden können. Insgesamt sind 4 Fließkomma-Kalkulationen pro Clock möglich, also potentiell 1,8 GigaFlops bei 450 MHz. Für Fließkommaberechnungen gibt es einen gemeinsamen Stack, so daß Task Switching zwischen 3DNow!- und MMXOperationen entfällt.13 9. [PAIRNET 1999b] 10.[Neal 1999] 11.[PAIRNET 1999c] 12.[AMDZONE 1999a] 13.[AMDZONE 1999a] Seminar Moderne Prozessorarchitekturen 15 AMD K6/K7-Familie Der Neue: AMD Athlon (a.k.a. K7)14 15 16 17 18 19 20 21 22 Allgemeines Der Athlon, Codename K7, ist der erste Prozessor der siebten Generation auf dem Markt. Er kann mit Taktraten weit jenseits von 500 MHz getaktet werden und wird zunächst in 0,25 µmTechnologie gefertigt. Geplant ist jedoch ein Shrink auf 0,18 µm bis Ende 1999, wodurch Taktraten noch höherer Größenordnung möglich werden. Wie weit die Taktrate potentiell gesteigert werden kann wird am Beispiel des K6-III deutlich, welcher bei 166 MHz startete und inzwischen bei 700 MHz angelangt ist. Der Projektleiter der Entwicklungsabtetilung des Athlon, die nur 18 Monate von der Planung bis zur Fertigung des ersten Prozessors benötigte, war Dirk Meyer, ein ehemaliger Alpha-Mitarbeiter. Damit hat sich AMD in Rekordtempo an die Spitze der Prozessorhersteller gesetzt, denn die Konkurrenten Intel und Cyrix können ihre vergleichbaren Prozessoren der siebten Generation (Codenamen “Willamette” & “Foster” bzw. “Jalapeno”) voraussichtlich erst frühestens Mitte 2000 auf den Markt bringen. Die 3DNow!-Operationen profitieren von den Verbesserungen am Chipdesign. Dies zeigt ein Beispielprogramm, das Vektor-Transformierung durchführt: Der K6-2 braucht 20 Zyklen pro Vektor, der Athlon nur etwa 14. Im Vergleich dazu benötigt der Pentium-III mit ISSE-optimiertem Code immer noch ca. 18 Zyklen für die gleiche Aufgabe. Der maximale Throughput für 3DNow! bleibt nach wie vor bei 4 Operationen pro Zyklus, und die Peak-Fließkommaleistung bei 500 MHz liegt bei 2 GigaFlops.23 Der EV-6 Bus von Alpha AMD hat das Busprotokoll EV-6 von Alpha lizensiert, anstatt das Busprotokoll GTL+ von Intel zu benutzen. Damit einhergehend ist nun auch AMD vom Sockel-Design zum Slot-Design übergegangen. Zum Einsatz kommt der Slot A, der auch für Alpha-Prozessoren verwendet wird. Die Slots von Intel (Slot 1) und AMD (Slot A) unterscheiden sich elektrisch, mechanisch sind sie jedoch gleich, wodurch die bestehenden Zulieferfirmen von Intel problemlos auch AMD mit Mainboard-Teilen bedienen können, so daß die Mainboards relativ günstig hergestellt werden können.24 14.[Meyer 1998] 15.[AMDZONE 1999b] 16.[Cholewa 1999] 17.[Gelas 1998b] 18.[Gelas 1999a] 19.[Gelas 1999b ] 20.[Hsieh 1999] 21.[Pabst 1998] 22.[Weber 1998] 23.[Gelas 1999a] 16 Seminar Moderne Prozessorarchitekturen Der Neue: AMD Athlon (a.k.a. K7) Für den Bustakt sind Einstellungen von 40 bis 400 MHz möglich bei einer Busbreite von 64 Bit. Weiterhin wird AGP4X unterstützt. Der Speicherzugriff ist bei einer Bandbreite von 1,6 GB/sec bei 200 MHz Bustakt erheblich schneller als bei Intel. Dementsprechend können schnelle Speicherbausteine wie RAMBUS oder DDRRAM (Double Data Rate RAM) eingesetzt werden. Es ist aber weiterhin auch der Betrieb von SDRAM möglich, ohne dadurch etwa das Gesamtsystem auszubremsen, da es getrennte Datenpfade (256 Bit; 100, 133 oder 200 MHz Takt) für den Speicherzugriff gibt. Der Addreß-Space umfaßt bei Slot A 64 GB, im Gegensatz zu den 4 GB, die mit Slot 1-Systemen möglich sind. Die Chipsätze für Mainboards werden voraussichtlich von VIA, Acer und AMD selbst hergestellt.25 Somit ist die Verfügbarkeit passender Slot A-Mainboards sichergestellt. Intel dagegen plant den Camino-Chipsatz für den Pentium-III erst für Ende 1999. Dieser Chipsatz wird zwar auch AGP4X unterstützen, an Speicher ist jedoch nur RAMBUS vorgesehen und der Bustakt ist auf lediglich 133 MHz beschränkt. Hier liegt AMD also zur Zeit klar vorne. Der wesentliche Vorteil von EV-6 ist die Tatsache, daß es sich um einen Point-To-Point-Bus handelt. Hierdurch lohnt der Einsatz von mehreren Prozessoren erheblich mehr. Jeder Prozessor hat einen eigenen Bus, so daß der Bus bei Einsatz vieler Prozessoren nicht schnell “voll” ist, wie es bei Intel-Multiprozessor-Systemen mit GTL+ häufig der Fall ist. Diese Intel-Systeme sind kaum mit mehr als vier Prozessoren gleichzeitig bei 100 MHz Bustakt betreibbar, da es nur einen einzigen Bus für I/O, AGP und PCI gibt. EV-6 bietet dagegen eigene Datenpfade zu den einzelnen Prozessoren, zum gemeinsamen Speicher, zu AGP und zu PCI. Das Problem des Memory-Sharing erledigt der Chipsatz. Man hat hier also wahrhaft “scalable multiprocessing capabilities”. Cache-Architektur Der AMD Athlon verfügt über 128 KB Level-1Cache, von denen je 64 KB für Data- und Instruction-Cache vorgesehen sind. Dies ist doppelt so viel wie AMD K6-2 und AMD K6-III haben und sogar viermal so viel wie der Pentium-2 hat. Der Celeron A verfügt über die gleiche Menge an L2Cache. Der L2-Cache des AMD Athlon ist On-Cartridge und kann 512 KB bis 8 MB groß sein. Er 24.[Cholewa 1999] 25.[Cholewa 1999] Seminar Moderne Prozessorarchitekturen 17 AMD K6/K7-Familie kann von 1/4 bis Full Speed getaktet sein, wobei 1/3 der Default-Wert ist, da er das beste Preis-/ Leistungsverhältnis bietet. Mit diesen vielfältigen Optionen und vor allem durch die große Ausbaufähigkeit des L2-Caches auf bis zu 8 MB und die neue, sehr gute Multiprozessorfähigkeit dringt AMD nun auch in den Servermarkt ein, den bisher Intel mit dem Xeon, der übrigens nur auf 2 MB L2-Cache aufgerüstet werden kann, bediente. 18 Seminar Moderne Prozessorarchitekturen Der Neue: AMD Athlon (a.k.a. K7) Athlon-Architektur Der Athlon verfügt über 3 parallele x86-Instruction-Decoding-Units, welche die Instruktionen in fixed-length “Makro-Operationen”, die aus ein bis zwei Operationen bestehen, übersetzen. Diese werden an die Instruction Control Unit weitergeleitet, in der 72 Instruktionen pufferbar sind, und die zwei verschiedene Pipelines hat: direct path für common operations und vector path für komplexere x86-Instruktionen, wobei diese im Macro Code ROM (MROM) nachgeschlagen werden. Weiterhin handelt es sich um eine 9-issue superscalar microarchitecture, welche im Einzelnen aus 3 Load-/Store-Units mit 15 Stufen, 3 superskalaren Integer-Units mit 10 Stufen (je 1 Integer Execution und Address Generation Unit) und 3 superskalaren FPU-/Multimedia-Units (FADD + MMXALU + 3DNow!, FMUL + MMX-ALU + 3DNow!, FSTORE) mit 15 Stufen besteht. Es gibt also 9 Execution Units. Der Pentium-III dagegen hat gerade einmal 5 Execution Units. Ferner erfolgt dynamisches Scheduling und Out-Of-Order Execution, wobei 18 Integer-Operationen und 36 Fließkomma-Operationen durch die Scheduler verteilt werden können. Diese Werte scheinen zufällig, sind aber explizit so gewählt, daß maximale Performance auf dem gegebenben DieSpace erreicht wird. Man sieht, Pipelining wird in extremem Maße betrieben. Mit 9 Stufen ist die Pipeline sehr tief, was sehr hohe Taktraten ermöglicht. Außerdem wird Superskalarität im Athlon großgeschrieben. Im Vergleich erledigen die 3-way-superskalaren Prozessoren K6-III 1.8, der Pentium-III 2.1 und der Athlon 2.52.8 x86-Instruktionen durchschnittlich pro cycle; die Parallelität der Ressourcen wird also fast optimal genutzt, und das schon bei den Durchschnittswerten. Damit diese enorm vielen Instruktionen möglichst nicht unnütz abgearbeitet werden, wurde eine Branch Prediction Table mit 2048 Einträgen und ein Return Stack mit 12 Einträgen vorgesehen. Seminar Moderne Prozessorarchitekturen 19 AMD K6/K7-Familie Ausblick auf den AMD K8 (“Sledgehammer”)26 Der “AMD K8” wird ein Prozessor der achten Generation sein. Geplant sind für die Entwicklung wie beim Athlon etwa 18 Monate, das heißt der erste “K8”Prozessor soll zwischen dem dritten Quartal 2000 und dem zweiten Quartal 2001 fertig sein. Er wird dann voraussichtlich in Konkurrenz zum “Intel Merced” stehen. Für die Fertigung ist 0,13 µm-Technologie anvisiert. Der “K8” soll etwa so schnell sein wie die schnellsten Prozessoren von Alpha dann sein werden, das hofft man wenigstens. Aber man darf nicht vergessen: dies alles sind nur Spekulationen und optimistische Schätzungen von AMD. 26.[Craighead 1999] 20 Seminar Moderne Prozessorarchitekturen Zusammenfassung Zusammenfassung Wie sich die - zur Zeit immer noch sehr angespannte - Situation AMDs in der Zukunft entwickeln wird ist schwer abzuschätzen. Immerhin hat AMD es geschafft, vor Intel einen Prozessor der siebten Generation in Rekordzeit zur Marktreife zu bringen. AMD scheint vom Platz des “Ewigen Zweiten” entkommen zu sein. Selbst bei der sonst immer so schwachen FPU-Leistung hat man mit einem wahren Performance-Sprung nicht nur zu Intel aufgeschlossen, sondern sie sogar überholt. Die Zusammenarbeit mit DEC war erfolgreich und hat AMD den leistungsfähigen EV-6 Bus eingebracht, welcher dem GTL+ Bus von Intel nicht nur wegen der besseren Multiprozessor-Unterstützung (“scalable multiprocessing capabilities”) weit überlegen ist. Es sind sehr hohe Taktfrequenzen, angefangen bei 500 MHz - geplant sind weit über 1 GHz, möglich. Die CacheArchitektur ist hochentwickelt und dank der vielfältigen Optionen für Speichergröße und -takt individuell an die Bedürfnisse verschiedenster Märkte, vom Privatmann bis zum Server-Betreiber, anpaßbar. Damit könnte AMD insbesondere den lukrativen Servermarkt, einen Hauptnachfrager für Multiprozessor-Systeme, den man bisher durch fehlende Multiprozessor-Unterstützung der AMDProzessoren nicht bedienen konnte, erobern. Aber auch der geneigte Computerspieler wird vom Athlon nicht enttäuscht: Mit 3DNow! hat man einen etablierten Instruktionssatz, für den schon vielfältige Anwendungen und Spiele existieren, die automatisch vom Geschwindigkeitsvorteil des Athlon profitieren. Der Pentium-III dagegen führt mit ISSE einen völlig neuen Instruktionssatz ein, der unabhängig davon, ob er besser ist als 3DNow!, noch von sehr wenig Software unterstützt wird. Der Athlon hat also als derzeit leistungsfähigster x86-Prozessor durchaus das Potential, AMD aus der Krise herauszuführen. Es mangelt jedoch an einer geeigneten Marketingstrategie. Hier hat Intel immer noch einen großen Image-Vorteil, den AMD versäumt aufzuholen. Denn leider zählt bei vielen Käufern immer noch einzig der “Intel inside”-Aufkleber. Seminar Moderne Prozessorarchitekturen 21 AMD K6/K7-Familie Quellenverzeichnis [AMD 1998a] History, AMD, 29.09.1998, http://www.amd.com/about/history.html [AMD 1998b] AMD-K5 Processor Overview, AMD, 30.06.1998, http://www.amd.com/products/cpg/k5/20010b.html [AMDZONE 1998] AMD Zone Reports: AMD On 3DNow! vs. KNI, AMD Zone, 12.02.1998, http://www.amdzone.com [AMDZONE 1999a] AMD Zone’s 3DNow! Section, AMD Zone, http://www.amdzone.com/3dnow/ [AMDZONE 1999b] Interview With Keith Galocy of AMD by AMD Zone, AMD Zone, http://www.amdzone.com/ [Cholewa 1999] John Cholewa: JC's AMD K7 Preview, 14.04.1999, http://www.chiptech.com/jc/article.cgi?AMD/K7_Preview [Craighead 1999] Matt Craighead: Storm3D.Com's K7 Preview, 07.03.1999, http://www.storm3d.com/k7/ [Cross 1999] Jason Cross: AMD K7: Aiming the big guns at Intel's flagship, 12.04.1999, http://www. [Gelas 1998a] Johan De Gelas: Understanding the Performance of the K6-3, 31.12.1998, http://www.aceshardware.com [Gelas 1998b] Johan De Gelas: The K7 Versus Katmai, the Battle of the x86-Titans, http://www.aceshardware.com [Gelas 1999a] Johan de Gelas, Understanding the K7: Hype or Next Generation CPU?, 01.04.1999, http://www.aceshardware.com [Gelas 1999b] Johan De Gelas: Understanding the K7: Slot A, RAM, and Cache, 24.03.1999 http://www.aceshardware.com [Hsieh 1999] Paul Hsieh: The Next Generation of Microprocessors, http://www.nettaxi.com/citizens/qed/newcpus.html 22 Seminar Moderne Prozessorarchitekturen Quellenverzeichnis [IXBT-LABS 1999] AMD K6-III 400MHz Review, IxBT-Labs http://www.ixbt-labs.com/cpu/k6-iii.shtml [Meyer 1998] Dirk Meyer: AMD-K7 Technology Presentation, AMD, 13.10.1998, http://www.amd.com/products/cpg/k7/pres/k7pres.pdf [Neal 1999] Brian Neal: Onboard Cache, Other Caches, and the K6-3, http://www.aceshardware.com [Pabst 1998] Thomas Pabst: AMD Moves onto the Overtaking Lane, 15.10.1998, http://www.tomshardware.com [Pabst 1999a] Thomas Pabst: Intel's Enemy No. 1 - The AMD K6 CPU, httpb://www.tomshardware.com [Pabst 1999b] Thomas Pabst: AMD’s K6-2 Processor, http://www.tomshardware.com [PAIRNET 1999a] AMD's K6-2, Pairnet, http://www.hardware.pairnet.com [PAIRNET 1999b] 3DNOW! sounds a lot like MMX. Don't they do the same thing?, Pairnet, http://www.hardware.pairnet.com [PAIRNET 1999c] What is 3DNow!?, Pairnet, http://www.hardware.pairnet.com [Weber 1998] Fred Weber: Future PC System Architecture - Internal, http://www.amd.com/.../winhec.pdf Seminar Moderne Prozessorarchitekturen 23 AMD K6/K7-Familie 24 Seminar Moderne Prozessorarchitekturen K APITEL 3 PowerPC/MPC750 Oliver Fritzen PowerPC - Geschichte Die PowerPC-Architektur stammt aus dem Jahr 1993 und wurde entwickelt vom PowerPC-Konsortium, bestehend aus den Unternehmen Apple, IBM und Motorola. Die Architektur ist im Wesentlichen eine Weiterentwicklung der POWER1-Architektur (IBM, 1990), einer RISC-Architektur für Anwendungen im professionellen Workstation-Bereich (z.B. IBM RS/6000er Reihe); der PowerPC ist sogar assemblerkompatibel zum POWER-Chip (einige POWER-Befehle sind im PowerPCBefehlsmix nicht mehr enthalten und werden mittels Traps über Software emuliert). Implementierungen: Bisher existieren folgende Implementierungen der PowerPC-Architektur: PowerPC 601, 603, 604, MPC740/750 Für Neuentwürfe empfohlen wird zur Zeit (Juli 1999) die PC740/750-Reihe; aktuelle Apple MacIntosh Desktop-Rechner werden mit einem den 750er PowerPC-Prozessor (G3) mit 400 MHz und 1 MByte Level-2-Cache verkauft. Der Motorola MPC750 - technischer Aufbau MPC7502 - Technische Daten Beim MPC/PPC750 handelt es sich um eine reine 32-Bit-Implementierung3 der PowerPC-Architektur mit einem 32-Bit-Adreßbus und einem 64-Bit-Datenbus. Nachfolgend einige technische Angaben: 1. Performance Optimized With Enhanced RISC 2. MPC740 und MPC750 unterscheiden sich nur dadurch, daß der MPC740 keinen Level-2-Cache hat und auch keine entsprechenden Steuerleitungen, weshalb der 740er Chip pinkompatibel zur 60x-Reihe ist und der 750er nicht 3. Es existiert auch eine vollständige 64-Bit-Spezifikation für die PowerPC-Architektur Seminar Moderne Prozessorarchitekturen 25 PowerPC/MPC750 • Taktrate:300,333,366,400 MHz • L1-Cache:2 x 32 KByte • L2-Cache:256, 512, 1024 MByte • Transistorenzahl:ca. 6.35 Millionen • Stromverbrauch:ca. 8 Watt (Hochlast, mit 300 MHz getaktet) • SPECint-Benchmarkwert:18.8 (400 MHz/1 MByte Level-2-Cache mit 200 MHz) • SPECfp-Benchmarkwert:12.2 (400 MHz/1 MByte Level-2-Cache mit 200 MHz) Der MPC750 verfügt außerdem über drei verschiedene Stromsparmodi (nap doze sleep) sowie über eine effiziente Wärmeregulierung, die sogenannte Thermal Assist Unit (TAU), die bei zu starker Wärmelast die Befehlsausführung unterbricht oder verlangsamt. MPC750 - Technischer Überblick Als moderne Prozessor-Architektur ist PowerPC ein typischer Vertreter des RISC-Sparte (siehe RISC-Kapitel); die Instruktionsausführung ist vierfach in Pipelines organisiert. Folgende Ausführungsstufen werden unterschieden: • FE - instruction FEtch • DE - instruction DEcode • EX - instruction EXecute • WB - instruction Write Back • Fetch-Stufe:Befehle werden aus dem Speicher geholt • Decode-Stufe:Opcode wird decodiert und Befehl identifiziert • Execute-Stufe:Befehl wird ausgeführt • Write Back-Stufe: Ergebnis der Operation wird in das Zielregister zurückgeschrieben Der Prozessor verfügt über mehrere (parallel benutzbare) Ausführungseinheiten (Execution Units), die es möglich machen, zwei (verschiedenartige) Operationen, z.B. eine Addition und ein Load in EINEM Taktzyklus auszuführen. Prozessoren mit mehreren unabhängigen Instruktionseinheiten werden als Superskalare bezeichnet, in Unterscheidung zum einen zu einfachen Skalarprozessoren, die nur eine Befehlsausführung pro Taktzyklus erlauben, und andererseits zu Vektorprozessoren, die es ermöglichen, n gleichartige Operationen gleichzeitig auszuführen. RISC Mikroprozessorentwürfe teilen sich in zwei Gruppen: CISC und RISC. CISC - Complex Instruction Set Computer - haben typischerweise einen großen Befehlssatz mit einer Vielzahl an komfortablen Befehlen mit aufwendiger Funktionalität, welche aber den Betrieb und auch den Entwurf solcher Maschinen teuer und langsam macht. Dem gegenüber steht der RISC-Entwurf: typische RISC-Prozessoren haben einen “kleinen” Befehlsmix mit wenigen verschiedenen Befehlen von vergleichsweise einfacher Funktionalität. Diese konzeptuelle Einfachheit macht es - nebst einiger anderer mit RISC assoziierten Merkmale möglich, schnellere Prozessoren zu entwerfen und zu bauen. Einige dieser Merkmale sind: • kleine Befehlssätze mit “primitiven” Operationen 26 Seminar Moderne Prozessorarchitekturen Aufbau und Arbeitsweise des MPC750-Prozessors • alle Befehle sind gleichlang (Alignment) • Pipelining Load/Store-Disziplin4 Typische Vertreter der RISC-Technik sind: DEC Alpha-Prozessoren, SUN SPARC, die Stanford MIPS, Intel i860 und natürlich der PowerPC. Typische CISC-Maschinen sind die Motorola 68000-Serie sowie die frühen Modelle der Intel 80x86-Reihe. Die späteren Intel-x86-Modelle sowie dazu kompatible Prozessoren (AMD K-x) sind eher als Hybride zu bezeichnen, da sie zwar vom Grundkonzept her (Befehlssatz, Microcoding) auf dem CISC-Rechner 8086 beruhen, die Entwickler aber mit der Zeit dazu übergegangen sind, immer mehr RISC-typische Features, wie z.B. Pipelining, zu verwenden. Instruction Unit 64 Bit = 2 Befehle BPU BTIC(64x2) BHT(512) CTR Completion Unit 128 Bit = 4 Befehle Fetcher Fetcher CR LR Dispatcher Dispatcher Instruction Queue Reorder Buffer IU1 IU1 BPU: BTIC: BHT: CTR: LR: IU: SRU: LSU: FPU: IU2 IU2 Branch Processing Unit Branch Target Instruction Cache Branching History Table Count Register Link Register Integer Unit System Register Unit Load/Store Unit Floating Point Unit SRU SRU LSU LSU FPU FPU Data Cache Instr. Cache Data MMU Instruction MMU SR SR SR SR DTLB DTLB DBAT/IBAT: DTLB/ITLB: DBAT DBAT ARRAY ARRAY ITLB ITLB IBAT IBAT ARRAY ARRAY Data/Instruction Block Array Translation Data/Instruction Target Lookaside Buffer Aufbau und Arbeitsweise des MPC750-Prozessors Die Vorgänge im Inneren des Prozessors werden unterteilt in sogenannte Units, die in Abb. 1.1 beschrieben sind. Ich möchte hierbei anmerken, dass dieses Diagramm nur dazu dient, logischfunktionale Zusammenhänge im Prozessor darzustellen; diese Darstellung stimmt i.a. NICHT überein mit der physikalischen Funktion der Prozessorhardware. 4. Als Load/Store-Architektur bezeichnet man solche Rechner, die arithmetisch-logische Operationen nur zwischen Registern, nicht aber zwischen beliebigen Speicherzellen ausführen können. Solche Operationen haben dann stets die Form: lade Argument(e) in Register (LOAD) führe Operation aus, d.h. schreibe Ergebnis in weiteres Register schreibe Inhalt des Ergebnisregisters in den Hauptspeicher zurück (STORE) Seminar Moderne Prozessorarchitekturen 27 PowerPC/MPC750 1. Instruction Unit (Fetch/Decode-Stage) Die Instruction Unit erledigt die Stufen FETCH und DECODE der Instruktionspipeline: Der Fetcher lädt bis zu vier Befehle gleichzeitig (in einem Taktzyklus) aus dem Instruktionsspeicher; wie viele Befehle tatsächlich geladen werden, hängt von der Anzahl der freien Slots in der Instruction Queue ab: sind dort in einem Zyklus 4 Slots frei, so werden in der nächsten Runde 4 Befehle nachgeladen, gab es nur einen freien Slot, holt der Fetcher nur einen Befehl. • Instruction Queue/Scheduler Die Instruction Queue puffert ankommende Befehle aus dem Codespeicher zwischen, um sie jederzeit sofort zugreifbar zu machen. In jeder Runde (Taktzyklus) werden die ein oder zwei “obersten” Queue-Positionen an den Dispatcher weitergegeben; die darauffolgenden Befehle rücken in der Queue nach. Der Dispatcher stellt mittels des Opcodes fest, um was für Befehle es sich handelt (Decoding), ob zwischen den Anweisungen Konflikte auftreten (Beispiel: eine Instruktion schreibt in ein Register, die nächste liest aus demselben Register). Falls dies nicht der Fall ist, werden die Befehle an die entsprechenden Execution Units weitergegeben und im selben Takt zwei neue Instruktionen aus der Instruction Queue nachgezogen. In der Instruction Queue landen sämtliche Befehle mit Ausnahme aller Verzweigungen: diese werden weitergegeben an die • Branch Prediction Unit (BPU). Diese Einheit ist zuständig für die Verabeitung von Verzweigungen: bedingte und unbedingte Sprünge sowie der Aufruf von Subroutinen. Ausserdem wird hier die Sprungvorhersage geleistet. Für die Adressberechnung verfügt die BPU über ein eigenes Addierwerk sowie eine Anzahl von reservierten Registern, so dass es nicht auf die allgemeine Prozessorarithmetik in den Execution Units zugreifen muß. Aufgrund des Pipelining (siehe Kap. xxx) ergibt sich die Notwendigkeit der Sprungvorhersage: ein bedingter Sprung besteht aus einer Sprungbedingung und einem Sprungziel. Trifft die Bedingung zu, wird der Sprung ausgeführt, trifft sie nicht zu, so wird die Programmausführung einfach nach dem Sprungbefehl fortgesetzt. Die Sprungzieladressenberechnung geschieht mittels der BPU-Adresslogik (s.o.), so dass das Ergebnis direkt zur Verfügung steht. Die Sprungbedingung kann aber nur in der Execution Unit ausgeführt werden, und diese ist in sich wieder “pipelined”: man muss also sozusagen im Voraus wissen, welche Befehle die Execution Unit in einem, zwei, drei oder vier Takten ausführen soll. Dies ist bei sequentieller Programmausführung nicht schwierig: man gibt der Unit einfach die nächsten x Befehle. Bei einem bedingten Sprung aber müßte man vorab wissen, welche Verzweigung genommen wird. Dieses Problem geht man mittels Sprungvorhersage (Branch Prediction) an. Die Sprungvorhersage für bedingte Sprünge funktioniert in zwei Modi: a) statische Sprungvorhersage: zu jedem Sprungziel wird per default-Annahme oder mittels eines mitgegebenen Bits entschieden, ob ein Sprung genommen wird oder nicht (man geht z.B. davon aus, daß für einen Sprung zurück i.a. die Sprungbedingung eintritt - siehe while-Schleife - , für einen Sprung nach i.a. vorne nicht). b) dynamische Sprungvorhersage: über die Sprungquote bisheriger Sprünge wird in der Branch History Table (BHT) buchgeführt; aufgeschlüsselt nach den Sprungzielen gibt es für jede Zieladresse vier mögliche Zustände: taken, strongly taken, not-taken und strongly not-taken. So lässt sich jeder (bereits bekannten) Zieladresse eine Wahrscheinlichkeit zuordnen. Ausserdem enthält der Branch Target Instruction Cache (BTIC) die 64 häufigsten Sprungziele5, so dass hier nun also die Befehle bekannt sind, die an der Sprungadresse stehen (meist paarweise) und nicht nur deren Adressen, um die Befehle DANN ERST aus dem Instruktionsspei- 5. ich war leider nicht in der Lage, herauszufinden, ob der BTIC oder andere Caches in der Lage sind. mit selbstmodifizierendem Code klarzukommen - auch nicht intensiver Webrecherche 28 Seminar Moderne Prozessorarchitekturen Aufbau und Arbeitsweise des MPC750-Prozessors cher zu laden, was mindestens einen, schlimmstenfalls etliche Zyklen kosten kann (cache misses u.a.). Auf diese Weise ist es nun möglich, einen “educated guess”, eine intelligente Schätzung anzustellen, ob ein Sprung genommen wird oder nicht. Trotzdem kommt es hin und wieder zu Fehlvoraussagen; es muss also eine Rückfallebene für sogenannte Mispredictions geben. Diese sieht so aus: Bevor der Dispatcher einen Befehl in die Execution-Unit-Pipeline gibt, erhält dieser Befehl einen Platz im Reorder Buffer in der Completion Unit. Die Operationen, die in der Execution Stage ausgeführt werden, schreiben ihre Ergebnisse nicht direkt in die Zielregister, sondern in sogenannte Register Buffers. Befehle, die nicht auf einem vorhergesagten Zweig liegen, werden - sobald fertig - aus dem Reorder Buffer gelöscht und der Wert im Register Buffer in das entsprechende Zielregister zurückgeschrieben (write-back). Bei Befehlen, die auf einem “unsicheren” (d.h. noch nicht aufgelösten) Zweig einer Sprungvorhersage liegen, wird die write-back-Stufe solange verzögert, bis die Sprungvorhersage aufgelöst ist. War die Vorhersage korrekt, so findet das write-back statt und die Befehlsausführung geht regulär weiter. War Die Vorhersage falsch, findet ein flush statt: es werden alle Befehle, die zum unsicheren Zweig gehören, aus der Execution Pipeline “hinausgespült” (daher “flush”), ohne dass ein write-back stattgefunden hat. Auif diese Weise wird gewährleistet, dass keine Ergebnisse aus falsch vorhergesagten Sprüngen Register- oder Speicherinhalte verändern können. 2. Execution Units (Execution-Stage) Das Ausführen arithmetischer oder binärer Operationen, laden und speichern von Registerinhalten oder der Zugriff auf Systemvariablen spielen sich in den Execution Units ab, die zusammen die dritte Pipelining-Ebene (Execution Stage) bilden. Es existieren insgesamt fünf Execution Units: • zwei Integerarithmetikeinheiten (IU1 und IU2), • eine Einheit für Gleitkommaarithmetik (FPU, Floating Point Unit), • die Load/Store-Unit (LSU) sowie die • System Register Unit (SRU). Die Integer Units IU1 und IU2 teilen sich 32 GPRs - General Purpose Register, Register für allgemeine Verwendung - von je 32 Bit Breite, und beherrschen Addition/Subtraktion sowie alle gängigen Binär- sowie Shiftoperationen. Multiplikation und ganzzahlige Division stellt lediglich IU1 zur Verfügung. Die Floating Point Unit verfügt über 32 Floating Point Register (FPRs) von je 64 Bit Breite, so daß je ein Register die double precision Darstellung einer reellen Zahl fassen kann. Die FPU unterstützt den IEEE-Floating-Point Standard 754 in Hardware; ausserdem gibt es einen non-IEEE-mode für zeitkritische Operationen. Die FPU ist in sich wiederum aufgeteilt in 3 Pipeline-Stufen: normalizedenormalize, add/multiply und round/convert. Die Load/Store Unit (LSU) ist (wer hätte das gedacht?) für das Ausführen von loads und stores zuständig, also dafür, Werte aus dem Speicher in Register zu laden und später einen zweiten Wert in den Speicher zurückzuschreiben (siehe dazu Fußnote zu Load/Store-Architekturen). In den Systemregistern stehen systemspezifische Daten wie Uhrzeiten, Maschinenstatus, exception bits bestimmter Operationen wie overflow/underflow, Systemzeit etc. Der Zugriff wird über die System Register Unit (SRU) geregelt, die wenig mehr ist als eine Anzahl von speziellen Registern (dedicated Registers), die oft nur für das Betriebssytem sichtbar sind und nicht für den Programmierer bzw für die Applikation. 3. Die Completion Unit (write-back stage) Die Completion Unit enthält den Reorder Buffer, in dem alle Befehle enthalten sind, die zur Zeit in der Execution Stage bearbeitet werden. Wenn die Befehle abgearbeitet sind und sichergestellt ist, Seminar Moderne Prozessorarchitekturen 29 PowerPC/MPC750 daß keine Misprediction eingetreten ist, werden die Werte aus den Register Buffers in die eigentlichen Register zurückgeschrieben und der Befehl aus dem Reorder Buffer gelöscht (retired). Näheres über Sprungvorhersage und Reorder Buffering auch im Abschnitt über die Branch Prediction Unit. Weitere Features Die Entwickler haben den PC750 noch mit weiteren Merkmalen ausgestattet, die den Prozessor besonders geeignet machen für den Einsatz in Monoprozessorumgebungen im PC-Bereich und bei Laptops, Handhelds u.ä. Thermal Management - Power Saving Es gibt einen Hitzesensor, der in regelmäßigen Abständen die Temperatur im Prozessorkern überprüft. Die Temperaturdaten werden digitalisiert und an die Thermal Management Unit (TAU) weitergegeben. Wird ein bestimmter Grenzwert überschritten, senkt die TAU selbständig (mittels eines speziellen Interrupts) die Prozessorleitung: es werden Leerzyklen (waiting cycles) eingefügt oder die Abarbeitung wird komplett ausgesetzt. Ausserdem verfügt der Prozessor über drei kaskadierte Stromsparmodi: nap, doze und sleep, die ebenfalls schrittweise die Wärmeleistung des Prozessors verringern. Diese beiden Merkmale erleichtern den Einsatz des Prozessors gerade in hitzeempfindlichen Umgebungen wie in Lap-,Palmtops, Notebooks, Handhelds usw, wo der Energieverbrauch und die Kühlung erhebliche Probleme bereiten. Die Wärmeleistung, die zwischen 3 (Sleep-Modus) und 8 Watt (Hochlastmodus bei 400 MHz) liegt, ist erheblich geringer als die der meisten anderen Prozessorfamilien mit vergleichbaren Leistungsmerkmalen (Bsp. DEC-Alpha-Prozessoren liefern 60 Watt Abwärme und mehr). Performance Monitoring Diese Technik erlaubt das Erfassen und Zählen von Instruktionen zur Laufzeit, ohne dabei zusätzlichen Overhead zu verursachen (und so das Ergebnis zu verfälschen). Der MPC740/750 stellt dafür bestimmte Register zur Verfügung, mit denen man Gruppen von Instruktionen spezifizieren und über deren Vorkommen Statistik führen kann. Performance Monitoring ist von großer Bedeutung für die Analyse, das Debugging und die Optimierung von Assembler- und Systemsoftware. Blick in die Zukunft Von einigen wurde der PowerPC bereits totgesagt, andere prophezeien ihm noch eine große Zukunft. Die Fakten, soweit bekannt, sehen so aus: Apple und Motorola haben für Mitte 1999 (was das auch heißen mag) einen neuen PowerPC-Prozessor angekündigt, der die bisher verwendeten MPC750-Prozessoren im MacIntosh ablösen soll. Dessen Features umfassen unter anderem: • Taktraten von 450 MHz und mehr • Unterstützung von bis zu 2 MByte Level-2-Cache • AltiVec-Erweiterung (Multimedia-Erweiterung mit mehreren 128-Bit-registern, auf denen man SIMD-Operationen ausführen kann) • Herstellung im 0.18 mikrometer-Prozess auf Kupferbasis SPECint- und SPECfp-Benchmarkwerte von 20.0 und mehr 30 Seminar Moderne Prozessorarchitekturen Verwendete Literatur: Der Prozessor wird voraussichtlich ca. 10.5 Millionen Transistoren haben - ca 1.1 Millionen davon entfallen auf die AltiVec-Erweiterung, was die Platine größer und den Prozessor teurer machen wird, was wohl der Hauptgrund ist wieso IBM AltiVec nicht in ihre PowerPC-Reihe übernimmt. Ungeachtet dieser Differenzen haben sich IBM und Motorola auf eine neue Embedded-Spezifikation für PowerPC-Prozessoren geeinigt, IBM entwickelt eine PowerPC-Variante (Projektname “Gekko”) für die nächste Nintendo-Spielekonsole mit dem Arbeitstitel “Dolphin”. Verwendete Literatur: “MPC750 RISC Microprocessor Technical Summary”, Motorola Inc. 1/99 “MPC750 RISC Microprocessor Hardware Specifications”, Motorola Inc. 6/98 S. Weiss, J.E. Smith: “POWER and PowerPC”, Morgan Kaufmann Publishers, 1994 “PowerPC Microprocessor Common Hardware Reference Platform: A System Architecture”, Morgan Kaufmann Publishers, 1996 “C’t - Magazin für Computer und Technik” 11/98 S29-33 Hans Messmer:”Pentium”, Addison-Wesley 1994 Hennessy/Patterson: “Computer Organization and Design”, Morgan Kaufmann Publishers, 1994 Seminar Moderne Prozessorarchitekturen 31 PowerPC/MPC750 32 Seminar Moderne Prozessorarchitekturen K APITEL 4 Alpha-Prozessoren (21x64) Jürgen Ballmann Designkriterien Zum Projektstart im Herbst 1988 wurden folgende Designkriterien für die Prozessorfamilie 21x64 festgelegt: 1. Hohe Rechnenleistung; Dies sollte durch hohe Taktfrequenz, die parallele Ausführung mehrerer Instruktionen und durch die Benutzung mehrerer Prozessoren erreicht werden. 2. Langlebigkeit; Die Architektur sollte eine »Lebenszeit« von 25 Jahren haben. 3. Kompatibilität mit VAX und MIPS; um VMS und (Digital-) UNIX ohne konzeptionelle Änderungen zu betreiben. 4. großer Adressraum; Dies ist eine direkte Folgerung aus 2.: 32 Bit Adressen sind heute (“within 10 years”[Sites 1992]) schon eine starke Einschränkung für eine Architektur. Architektur Die Alpha-Architektur ist eine 64 Bit Reduced Instruction Set Computer Archtektur. Außer LOAD und STORE greifen keine Operationen auf den Speicher zu. Alle Operationen (außer LOAD/ STORE) finden nur zwischen Registern statt. Es gibt keine condition codes, alle Ergebnisse von Operationen werden in Register geschrieben, oder lösen Traps aus. Alle Register sind 64 Bit breit. Im einzelnen sind das: • 32 Integer Register, • 32 Floating Point Register, • 1 PC, • je 2 Lock Register (für jeden Prozessor in einem Multiprozessorsystem) • und optionale Register die für Memory prefetch und VAX-Kompatibilität benutzt werden. Das letzte Integer / Floating Point Register R31 / F31 wertet jeweils nach Null aus. FP Operationen können in VAX- und IEEE-Format (siehe defered trap/write) jeweils mit einfacher und doppelter Genauigkeit ausgeführt werden. Seminar Moderne Prozessorarchitekturen 33 Alpha-Prozessoren (21x64) Befehlssatz Für die Adressierung eines Registers werden 5 Bit benutzt, daraus folgt, daß jeweils nur 32 Register adressierbar sind. Alle Instruktionen sind 32 Bit lang, wovon 6 Bit Opcode sind. Es werden 4 Formate unterschieden: 1. PALCode Format: Eine PALCode-Funktion wird ausgeführt. 2. Branch Format: Das Register RA wird getestet; Fällt der Test positiv aus, wird nach PC + (4 * Disp) gesprungen. Das Vorzeichen inm Displacement bleibt bei der Erweiterung von 21 auf 64 Bit erhalten. Durch die Multiplikation mit 4 wird erreicht, das nur ganze 32-Bit Befehle (LONGWORD) adressiert werden können. 3. Load/store Format: Daten werden zwischen RA und der Speicherzelle, die durch RB und dem vorzeichenbehafteten Displacement bestimmt wird, verschoben. 4. Operate Format: FloatingPoint-Operationen benutzen RA und RB als Quellen und schreiben das Ergebnis in RC. Das Function-Feld dient als extended Opcode. Integer-Operationen benutzen RA und RB oder eine 8 Bit Zahl als Quellen und schreiben das Ergebnis ebenfalls in RC. Sieben Bit des Funktion-Felds werden hier als extended Opcode benutzt. Besonderheiten Außer 64 Bit werden auch 32 Bit Operationen unterstützt. Diese können in beliebiger Reihenfolge ausgeführt werden, es gibt keinen speziellen 64 oder 32 Bit Modus.8 und 16 Bit Operationen können nur mit shift/mask und den auf 8/16Bit äquivalenten 32/64-Bit Operationen emuliert werden. Mit den Befehlen UMUL und UMULH können die unteren/oberen 64-Bit einer “128 Bit” Multiplikation einzeln berechnet werden. Auch eine Integer-Division muß emuliert werden. Dies geschieht entweder mit PALCode oder bei Division durch eine Konstante mit einer 128 Bit Multiplikation. Integer und Floating Point Einheiten können nicht gegenseitig auf Register zugreifen. Zwar kann die FP-Einheit Zahlen umwandlen, aber der Zugriff muß über den Speicher (L1-Cache) erfolgen. Mit Conditional Move-Befehlen (CMOVxx) können Sprünge vermieden werden. Defered write/traps Lese/Schreib-Operationen auf verschiedenen Speicherbereichen werden zu beliebigen Zeitpunkten tatsächlich ausgeführt. Insbesondere muß die Reihenfolge der Ausführung nicht von der Reihenfolge im Programm abhängen. Da dies besonders in Multiprozessorsystemen zu Problemen führt kann man mit dem Befehl MB (Memory Barrier) Lese/Schreib-Operationen serialisieren. Auch Traps können erst mehrere Prozessorzyklen nach ihrer Auslösung, dann zusammen mit anderen, ausgeführt werden. Der Trap-Handler hat dann evtl. Schwierigkeiten die auslösende Instruktion genau zu bestimmen. Floating Point Operationen sind so nicht mehr IEEE-konform. Traps lassen sich durch den Befehl TB (Trap Barrier) serialisieren. 34 Seminar Moderne Prozessorarchitekturen Adressraum PALCode Die Privileged Architecture Library ist eine Menge von Makros aus Assemblerbefehlen, die entwickelt wurde um Microcode zu vermeiden (Microcode-befehle können nicht verändert werden und es wird eine vergleichsweise großer Teil des Prozessors für Befehle reserviert, die selten oder nie ausgeführt werden). Eine PALCode-Operation sieht “von aussen” aus, wie eine atomare Operation. Während der Ausführung sind alle Interrupts abgeschaltet. Man hat volle Kontrolle über den Prozessorstatus, kann auf interne Register zugreifen. PALCode wird benutzt um Betriebsystem-Operationen auszuführen: Context switch, Interrupt/ Exception-Handling, Hardwareinitialisierung und Speicherverwaltung. Oder um nicht vorhandene Befehle zu emulieren: z.B. Integer-Divison, HALT oder wie mit “FX32!” einen anderen Prozessor. Adressraum Die Alpha-Architektur bietet 64 Bit breite virtuelle Adressen. Eine Adresse besteht aus fünf Teilen (s. Abb.): Das “byte in page” Feld ist 13 bis 16 Bit lang. Entsprechend sind die Seiten 8 bis 64 KB groß. Die Felder “Level 1” bis “Level 3” adressieren eine Seite in der (dreistufigen) Seitentabelle. Sie sind 10 bis 13 Bit breit. Im “Fill” Feld wird nur das höherwertigste Bit aus “Level 1” wiederholt, dieses Feld dient nicht zur Adressierung. Es sind also maximal 55 Bit (16+3*13=55) als virtuelle Adressen nutzbar. Als physische Adressen sind nur 48 Bit nutzbar. Dies entspricht 256 TB an adressierbarem Speicher. Prozessormodelle 21064 (EV4) Der erste Vertreter der 21x64 Familie hatte nur jeweils eine Integer, Floating Point und Load/Store Einheit. Als 21066 bzw. 21068 wurde der 21064 mit eingebautem PCI Interface (33 bzw. 66MHz) für den Low-Cost Markt gebaut. 21164 (EV5) Der Nachfolger, 21164, hat eine weitere FP-Einheit und die Load/Store-Einheit kann nun auch Integer-Berechnungen machen. Um die Geschwindigkeit des Prozessors weiter zu steigern wurde er mit einem 96 KB großen Level 2 Cache (on-chip) ausgerüstet. Seminar Moderne Prozessorarchitekturen 35 Alpha-Prozessoren (21x64) Auf den Markt kam er in Varianten von 300 MHz bis ~700 MHz, bei einer Strukturgröße von 0.5 bis 0.28 µm. Für den Low-Cost Markt wurde der 21164PC gebaut: ein verbesserter 21164er Kern ohne L2-Cache. 21264 (EV6) Der aktuelle Prozessor, der 21264, hat nun je zwei Integer, Integer/Load/Store und Floating-Point Einheiten. Einen L2-Cache hat dieser Prozessor nicht, stattdessen verfügt er über einen schnellen L2-Cache-Bus. Der L2-Cache befindet sich mit dem Prozessor auf einer Daughter-Card (ähnlich Intel Pentium II). Hergestellt wird der 21264 mit Taktraten von 525 MHz bis 1GHz, bei Strukturgrößen von 0.35 bis 0.18 µm. Eine Branch Prediction Unit sorgt u.a. dafür, daß bedingte Sprünge, und die folgenden Instruktionen, ausgeführt werden, obwohl die Bedingung für den Sprung noch nicht ausgewertet wurde (speculative execution). Unabhängige Instruktionen werden in beliebiger Reihenfolge (out of order) ausgeführt. Die Prozessoren der 21x64er Familie haben intern mehr als je 32 adressierbare Register. Diese Register können bei jeder Instruktion ein anderes, adressierbares Register repräsentieren ( rename register ). So können unabhängige Instruktionen gleichzeit ausgeführt werden, auch wenn sie auf gleichen Registern operieren. Die Integer Pipeline hat sieben Stufen: 0: FETCH: 1: TRANSFER: 2: MAP: 3:QUEUE: 4: REG: 5: EXEC: 6: DCACHE: Instruction Fetch / Branch Prediction bis zu 4 Instruktionen in MAP-Einheit laden Register umordnen Instruktionen aus der Warteschlange lesen Register lesen Instruktionen ausführen Register und DCache schreiben Die Floating Point Pipeline hat neun Stufen, da die Execute-Phase länger dauert. 36 Seminar Moderne Prozessorarchitekturen Zusammenfassung 21364 (EV7) Das zukünftige Falgschiff, der 21364, wird mit einem Takt von mehr als 1GHz betrieben. Der Prozessor ist aber lediglich ein verbesserter 21264er Kern mit 3 Gimmicks: 1. 1,5 MB L2-Cache: ~90% der 100 Millionen Transistoren des Prozessors sind L2-Cache 2. ein Memory Controller für “Direct RAMbus(TM)”: 800MHz schnell aber nur 16 Bit breit 3. ein Netzwerkinterface um mehrere Prozessoren zu verbinden. Netzwerkinterface Dieses Netzwerkinterface bietet dem Prozessor 4 Verbindungen (N, E, S, W) zu anderen Prozessoren. Jede Verbindung kann bis zu 10 GByte pro Sekunde übertragen (vgl: Speicher 6GB/s, IO 3GB/ s). Da die Daten nicht über den Systembus, zu anderen Prozessoren, geleitet werden müssen wird dieser entlastet. Durch dieses Interface können einfache Multiprozessorsysteme mit maximal 64 Prozessoren gebaut werden. z.B. Transputer (s.u.), Systeme mit verteiltem Speicher. Systeme mit gemeinsamen Speicher sind möglich, ihre Realsierung ist aber durch die elektrischen Spezifikationen des Direct RAMbus wesentlich schwieriger. Zusammenfassung Die Alpha-Architektur ist eine “reine” 64 Bit RISC Architektur, keine 32 Bit Architektur die nur um 64 Bit-Befehle erweitert wurde. Mit einer Software-Bibliothek (PALCode) wird Microcode vermieden. Die Prozessoren können mit einer hohen Taktfrequenz gebaut werden und sind zur Zeit schon verfügbar. Einsatzbereich:vom Büro-PC bis Parallelrechner. Allein die aktuellen Kosten schränken den Einsatzbereich ein. UNIX-Systeme auf Basis von 64-Bit Prozessoren sind Jahr - 2038 - kompatibel ! In Zukunft wird der 21364 gegen den IA-64 (alias Merced) antreten. Seminar Moderne Prozessorarchitekturen 37 Alpha-Prozessoren (21x64) Literatur [Sites 1992] Alpha Architecture Reference Manual Richard L. Sites ,1992 Digital Press ISBN 1-55558-098-X http://www.samsungsemi.com http://www.alphaprocessors.com http://www.digital.com http://www.tasc.com http://chemphys.weizmann.ac.il http://www.tomshardware.com 38 Seminar Moderne Prozessorarchitekturen K APITEL 5 Scalable Processor Architecture SPARC - Version 9 Alexander Greiml Historisches Die Entwicklungsgeschichte der SPARC-Architektur beginnt bereits in den Jahren 1980-84, als SUN Microsystems, Hersteller von Unix-Workstations, nach Prozessoren zum Ersatz der zu rechenschwach gewordenen Motorola 680x0-Reihe suchte. Verschiedene Versuche mit anderen CPUs (z.B.: SUN 386) ernüchterten die Entwickler und ließen den Entschluß reifen, einen eigenen Prozessor herzustellen, der den Bedürfnissen nach Geschwindigkeit und Skalierbarkeit entsprach. Vorgabe war, einen modernen Prozessor mit einfachem Aufbau zu beschreiben, der zudem genügend Potential in sich barg um lange Zeit einsatzfähig zu sein. Da SUN selbst keine Chips produzierte, entwickelte man eine Instruction-Set-Architecture, die an mehrere Prozessorhersteller lizenziert wurde. Der Name dieser 1985 vorgestellten Architektur war SPARC, ein Acronym für Scalable Processor Architecture. Basis des Systems war ein entsprechend den Wünschen der SUN Entwickler modifizierter RISC-2 Prozessor, der TMS 9900, der 1983 um Professor Patterson an der University of Berkeley entwickelt wurde. Texas Instruments schaffte es, einen, der SPARC-Definition entsprechenden Chip herzustellen und bereits 1987 verkaufte SUN den ersten auf SPARC basierenden 32-bit Rechner. Um der fortschreitenden Entwicklung der SPARC Architektur Vorschub zu leisten gründete SUN 1989 SPARC International, ein Konsortium zur Förderung und Wahrung der SPARC Architektur. Geburtskapital dieses offenen Vereins, bei dem jeder Mitglied werden kann, waren die Rechte an der SPARC Architektur. 1994 wurde mit der SPARC Version 9 die erste 64-bit SPARC Architektur vorgestellt, und noch im gleichen Jahr konnte HAL, ein Mitglied von SPARC International, den ersten SPARC Version 9 konformen Prozessor, SPARC64, anbieten. Wenige Monate später verkaufte SUN den ersten SPARC V9 konformen Prozessor, den UltraSPARC-1 und schließlich wird seit 1997 der UltraSPARC-2 Prozessor, eine Weiterentwicklung des UltraSPARC-1, produziert. Was ist SPARC SPARC ist keine proprietäre Prozessorfamilie, sondern eine Instruction-Set-Architecture, das heißt eine Beschreibung der Eigenschaften der Hardware aus Sicht der Software. Das Verhalten und die Eigenschaften des Prozessors werden definiert, nicht aber die Umsetzung dieses Verhaltens in einem realen Chip oder einem Simulationssystem. Die Überprüfung auf SPARC-Konformität übernimmt SPARC International, das eingereichten Systemen nach bestandener Prüfung die SPARC Compliance bestätigt. Hieraus folgt, daß unterschiedliche Chips oder Chip-Sets oder gar Simulati- Seminar Moderne Prozessorarchitekturen 39 Scalable Processor Architecture - SPARC - Version 9 onssysteme konform der SPARC-Definition sein können und sich somit als SPARC-Systeme bezeichnen dürfen. Die SPARC-Version 9 Architektur SPARC-Prozessoren bestehen per Definition aus einer Floating Point Unit (FPU), einer Integer Execution Unit (IEU) und optional aus einem oder mehreren benutzerdefinierten CoProzessoren (CP). Weiterhin stellt die SPARC Definition eine Memory Management Unit vor, die als ReferenzMMU nach belieben verwendet werden kann. Als RISC Architektur erlaubt SPARC Speicherzugriffe und I/O nur mittels Load/Store durch die IEU. Die Steuerung und der Datentransfer von/zu der FPU und dem CP erfolgt immer über die IEU, die die zentrale Steuereinheit des Prozessors ist. Bild 4. Allgemeiner Aufbau der SPARC FPU IEU CP Data-Bus Control-Bus MMU Address-Bus Speicherworte und Register sind 32 oder 64 bit breit, über die genaue Art des Bussystems, der Caches und weiterer implementationsabhängiger Systemteile gibt die Definition keine Auskunft, da, wie bereits angesprochen, SPARC eine Instruction-Set-Architecture ist und somit den Herstellern in allen Fragen der Implementation freie Hand läßt. Eigenschaften der FPU Die FPU arbeitet parallel, nicht notwendigerweise synchron, zur IEU, d.h. daß eine einmal angestoßene Operation der FPU bis zu ihrem Abschluß die Operationen der IEU nicht unterbricht oder verzögert. Eine SPARC FPU besitzt 32 Register zu je 64 bit, die wie folgt verwendet werden können: 32 32-bit Register (Half Word) 32 64-bit Register (Word) 16 128-bit Register (Double Word) Um die Eigenschaften der FPU genau zu beschreiben, wurden die IEEE Standards 754 (32bit Floating Point Processing) und 1596.5 (64bit Floating Point Processing) verwendet, die von jeder SPARC Version 9 konformen FPU erfüllt werden. Die Integer Execution Unit Die Integer Execution Unit (IEU) ist das zentrale Rechenwerk der SPARC Architektur. Sie ist zuständig für alle Integer- und Adressberechnungen. Da SPARC eine RISC Architektur ist, existiert kein Microcode. Alle Instruktionen werden in einem Taktzyklus ausgeführt (One-Instruction-perCycle) und alle Speicherzugriffe geschehen RISC-typisch nur durch Load/Store Operationen. Die SPARC-Architektur besitzt eine Pipeline mit Interlock, d.h. daß die Prozessorpipeline den Zugriff 40 Seminar Moderne Prozessorarchitekturen Die SPARC-Version 9 Architektur auf die Zielregister von Load/Store Operationen solange verzögert, bis die Daten korrekt aus dem Hauptspeicher geladen wurden. Status- und Kontrollregister der IEU Die SPARC V9 Architektur beschreibt 25 Register, die für die Steuerung und Kontrolle des Prozessorzustandes unbedingt vorgesehen und damit fest definiert sind. Hierzu gehören neben dem Prozessor Status Register auch Program Counter, Trap Register und Registerfenster Steuer- und Statusregister, wie in Tabelle 1 aufgelistet. Neben diesen fest definierten Registern können je nach Prozessorimplementierung weitere Register optional eingesetzt werden. Tabelle 1. Einige SPARC Register Program Counter Register Processor State Register Current Window Pointer next Program Counter Register Condition Codes Register Restorable Window Register Trap Program Counter Register Hardware Clock Register Savable Window Register Trap next Program Counter Reg. Y-Register Other Window Register Trap Base Address Register Processor Interrupt Level Register Window Status Register Trap Type Register Floating Point State Register Clean Windows Register Trap Level Register Floating Point Register State Reg. Version Register Trap State Register Address Space Identifier Register General Purpose Registers SPARC Prozessoren besitzen ein Current Window Pointer Register, das auf das jeweils aktive Registerfenster des Prozessors verweist. Obwohl alle SPARC Register wenigstens 32 bit breit sind, werden nur 5 bit des CWP Registers verwendet, was zur Folge hat, daß maximal 32 Registerfenster adressierbar sind. Somit besitzen SPARC Prozessoren maximal 32 Registerfenster zu jeweils 16 Registern, sowie 8 globale Register. Die Definition schreibt unter anderem ein Minimum von 3 Registerfenstern vor, das konforme Prozessoren besitzen. Die User-Software kann von diesen maximal 520 Registern jeweils nur 32 Register adressieren, nämlich 8 incoming Register, 8 outgoing Register, 8 lokale Register sowie die 8 globalen Register. Bild 5. SPARC General Purpose Register Windows globale Register globale Register outgoing Params CWP local Parameters outgoing Params Overlap incoming Params local Parameters incoming Params Function Call with SAVE Seminar Moderne Prozessorarchitekturen 41 Scalable Processor Architecture - SPARC - Version 9 Wie im folgenden Abschnitt gezeigt wird, sind immer 3 Registerfenster in Verwendung, so daß nur die Anzahl der Registerfenster-2 für Funktionen verwendbar sind (daher resultiert auch die Forderung nach mindestens 3 Registerfenstern). Dadurch, daß sich die Frames der outgoing- und incoming-Register überschneiden, wird die Verwendung des Speicherstacks bei Funktionsaufrufen und Traps reduziert. Nur wenn eine Funktion oder Trap mit mehr als 8 Argumenten aufgerufen wird, muß ein Window Fill/Spill-Trap ausgeführt werden, der einem konventionellen Zugriff auf einen Stack entspricht. Window Fill/Spill ist auch notwendig, wenn die Anzahl der verwendeten Registerfenster größer der Anzahl der verfügbaren Registerfenster ist. Hierbei werden ganze Registerfenster in den Hauptspeicher ausgelagert und bei Bedarf wieder eingelagert. Dies geschieht durch einen hochprioren Hardware-Trap (siehe Abschnitt Traps und Interrupts). Wie in Bild 2 dargestellt, reduziert der Window-Overlap, die Verwendung eines speicherbasierten Stacks. Aufgrund der Untersuchungen von Patterson/Hennessey um 1980 wurden die quantitativ nachgewiesenen Größen von Funktions- und Prozeduraufrufen zur Auslegung der Registerframes und -fenster verwendet. Register Window Management mit Register Window State Registern Das Management der Register Windows geschieht vollständig unter der Kontrolle der Hardware, was ausschließt, daß Registerfenster überschrieben oder übersprungen werden. Ein Wechseln des Registerfensters geschieht durch die SAVE Instruktion, die den Inhalt eines Registerfensters sichert und den Current Window Pointer (CWP) inkrementiert. Sollten keine freien Registerfenster verfügbar sein, so kommt es zu einem Window Spill/Fill Trap, der den Inhalt eines Registerfensters in den Hauptspeicher auslagert. Hier werden die Inhalte der Registerfenster wie in einem normalen LIFOStack gehalten. Um zu erkennen, wann Registerfenster verfügbar sind, bzw. wann ein Window Spill/Fill Trap ausgelöst wird, existieren die Zeigerregister Restoreable Windows Register, Savable Windows Register und Other Windows Register. Restorable Windows Register enthält die Anzahl der Registerfenster, die vom momentanen Programm verwendet werden können, ohne daß RESTORE einen Window Fill Trap auslöst. Savable Windows Register enthält die Anzahl der Registerfenster, die nicht aktuell verwendet werden, und somit ohne Window Spill Trap verfügbar sind. Other Windows Register enthält die Anzahl der Windows, die mit Spill/Fill ein- bzw. ausgelagert werden sollen. Bild 6. 42 SPARC Register Window Management (8 Registerfenster) Seminar Moderne Prozessorarchitekturen Traps und Interrupts Traps und Interrupts Traps sind alle Arten von Unterbrechungen des Kontrollflußes. Dies können Interrupts sein, also Unterbrechungen durch die Hardware, oder Unterbrechungen durch Funktionsaufrufe der Software, beispielsweise um Dienste des Kerns in Anspruch zu nehmen (Softwareinterrupts oder KernelTraps). Traps verhalten sich wie unerwartete Prozeduraufrufe. Sie veranlassen die Hardware 4. den Prozessorzustand in einem Hardware Register Stack zu sichern (Program Counters, CWP, CCR, PSTATE und TrapType), 5. in den privilegierten Modus zu wechseln und 6. mit der Ausführung des Trap Handler Codes, beschrieben durch den Trap Vektor, zu beginnen. Für den SPARC Prozessor ist keine Unterscheidung dieser Traps nötig, da die Systemsoftware auf Traps mit entsprechenden Trap Handlern reagieren muß. Der Prozessor bietet hierfür 5 verschiedene Trap Level an, die je nach Dringlichkeit gestaffelt sind. Jeder Trap besitzt eine Dringlichkeit, die dem Trap-Level entspricht. Bearbeitet der Prozessor einen Trap vom Level 0, so heißt das, daß der normale Programmfluß abgearbeitet wird. Um die Trap-Handler zu vereinfachen, können nur Traps eines höheren Levels wie der des momentan Bearbeiteten den Kontrollfluß unterbrechen. Die Trap Handler müssen dadurch nicht auf niederpriore Traps eingehen, um diese eventuell später zu behandeln. Die Trap Level und die Trap Typen sind in Tabelle 2 aufgelistet. Tabelle 2. Trap-Level Trap-Level Usage 0 normal execution 1 System calls; interrupt handlers; instruction emulation 2 Window spill/fill 3 Page-fault handler 4 RED-state handler (Handler für Prozessorfehler; Reset-, Error-, Debug State) Trap Management und Trapping Um Traps verwenden zu können, müssen zunächst von der Systemsoftware die Trap Handler installiert werden. Hierzu wird das Trap Base Register der SPARC Version 9 Hardware mit der Startadresse des Trap Handling Codes beschrieben. Im Trap Type Register ist für den jeweiligen Trap der Offset des Trap Handlers festgelegt, der beschreibt, wie weit der Handler von der im Trap Base Register festgelegten Startadresse entfernt ist. Dieser Offset besteht aus jeweils 8 Instruktionen, 32 Instruktionen für Window spill/fill Traps, die von den Trap Handlern mitgenutzt werden können. Die hieraus resultierende Adresse wird auch als Trap Vektor bezeichnet. Der Vorteil dieser Methode besteht darin, daß eventuell mit diesen 8 bzw. 32 Instruktionen Sprünge im Trap Handling Code reduziert oder vermieden werden können. Da Traps des Typs 1, also System Calls und Interrupt Handler die Majorität der Traps ausmachen, wurden mit SPARC V9 Fast-Traps eingeführt. Bild 7. Trap Vektoren Trap Base Register + Trap Type Register } Handler 1 Handler 2 Handler 3 Seminar Moderne Prozessorarchitekturen Trap Vector Handler 4 Handler 5 Handler 6 43 Scalable Processor Architecture - SPARC - Version 9 Hierbei wird nicht wie bisher in Version 7 und 8 üblich für jeden Trap ein Registerfenster der General Purpose Register verwendet, sondern es existieren zusätzlich 8 Alternalte Global Registers, die exklusiv für Trap Level 1 Code reserviert sind. Durch Fast-Traps werden zusätzliche Window spill/ fill Traps vermieden, bzw. reduziert, da diese 8 Register immer verfügbar sind. Bild 8. Registerverwendung beim Trapping Trap Level 0 Trap Level 1 Trap Level > 1 alternate globals globale Register globale Register globale Register outgoing Params local Parameters outgoing Params outgoing Params local Parameters local Parameters incoming Params incoming Params incoming Params Deferred Traps Bei den direkten Traps wird ein Trap vor Abschluß einer Instruktion und der damit verbundenen Zustandsänderung des Prozessors ausgelöst. Um den Durchsatz in der Pipeline zu erhöhen und Wartezeiten bei der Instruktionsbearbeitung zu vermeiden, können Instruktionen beendet werden und den Prozessorzustand ändern bevor alle Auswirkungen auf das System bekannt sind. Erzeugt eine solche Instruktion nach ihrer Beendigung einen Trap, so spricht man von deferred Traps, da die erforderliche Ausnahmebehandlung erst nach der Zustandsänderung des Prozessors einsetzen kann. Beispiele für deferred Traps sind Speicheroperationen, bei denen während der Instruktionsausführung nicht klar ist, ob die Operation korrekt beendet wird, da sie eventuell erst einige Zyklen nach der Instruktionsbearbeitung zum Abschluß kommt. Statt dessen muß in diesem Fall der Prozessorzustand vor der Instruktionsausführung gesichert werden, um bei Bedarf den Prozessor wieder in seinen ursprünglichen Zustand (Zustand vor Beginn der Instruktion) zurücksetzen zu können. Die zu sichernde Zustandsmenge ist von der Tiefe der Pipeline und der Verzögerung der Operationen abhängig. Um den Prozessorzustand zuverlässig wiederherstellen zu können, erlaubt SPARC keine Verzögerung von Traps über neue Traps hinaus. Sonst können z.B. die Registerfenster gewechselt, oder I/O durchgeführt werden, was den alten Systemzustand nicht mehr reproduzierbar macht. Nachteil von verzögerten Traps ist, daß die alten Prozessorzustände gesichert werden müssen, was nur durch das Speichern der Registerinhalte, und somit einer erhöhten Speicherkapazität der CPU möglich ist. Der entscheidende Vorteil von verzögerten Traps ist, daß die nachfolgenden Instruktionen bereits abgearbeitet werden können, obwohl eine vorhergehende Operation noch nicht vollständig abgeschlossen wurde. Die Verwendung von deferred Traps ist in der SPARC Definition Version 9 optional. 44 Seminar Moderne Prozessorarchitekturen Instruktionsformate und Instruktionen Instruktionsformate und Instruktionen Instruktionsformate Die Länge einer Instruktion ist immer 32 bit. Die SPARC Instruktionsformate können grob in 4 verschiedene Kategorien gegliedert werden, die wiederum aus mehreren Unterformaten bestehen. Die bits 30 und 31 bilden das op-Feld, das beim Instruction Predecoding verwendet wird. Bild 9. SPARC Version 9 Instruktionsformate Format 1 (op = 1): Call op disp 30 Format 2 (op = 0): SETHI & Branches (Bicc, BPcc, BPr, FBfcc, FBPfcc) op op2 Format 3 (op = 2 or 3): Arithmetic, Logical, MOVr, MEMBAR, Load and Store op op3 Format 4 (op = 2): MOVcc, FMOVr, FMOVcc and Tcc op op3 condition code fields Instruktionen Insgesamt besitzt der SPARC Version 9 Instruktionssatz 82 fest definierte Integer-Instruktionen. Zu diesen kommen je nach Implementierung bis zu 5 herstellerdefinierte Integer-Instruktionen hinzu. Neu am Instruktionssatz ist, daß in Branch Instruktionen ein 1 bit p-Feld existiert, das angibt, ob eine Branch verfolgt wird oder nicht. Neu ist auch die Gruppe der Conditional Move Operationen MOVcc, MOVr, FMOVcc und FMOVr, die, abhängig von Condition Codes (cc) bzw. Registerinhalten (r), Inhalte von Source-Registern verschieben. Z.B. kann der C-Ausdruck if (A > B) X = 1; else X = 0; codiert werden als cmp %i0, %i2 | (A > B) or %g0, 0, %i3 | set X = 0 movg %xcc, %g0, 1, %i3 | overwrite X with 1 if A > B was die Notwendigkeit eines Sprunges eliminiert. Ansonsten werden die Instruktionen der SPARC V8 mit 64 bit Adressformaten verwendet. Multiprozessor Synchronisationsprimitive Die bereits in SPARC Version 8 vertretenen Multiprozessor Synchronisationsprimitive wurden an die neue Architektur angepaßt. Die Barrier Instruktion STBAR wurde zu MEMBAR, der 64 bit Variante. Obwohl hiermit wechselseitiger Ausschluß programmiert werden kann, existieren weitere, atomare, Instruktionen zum direkten wechselseitigen Ausschluß. Tabelle 3. Atomare Instruktionen zum wechselseitigen Ausschluß Compare and Swap (CASA, CAXSA) Vergleicht den Wert eines Registers mit einem Speicherinhalt. Wenn die Werte gleich sind, wird der Speicherwert mit dem Registerwert getauscht. Load Store Unsigned Byte (LDSTUB, LDSTUBA) klassisches Test and Set Swap (SWAP, SWAPA) vertauscht Register- und Speicherinhalt Seminar Moderne Prozessorarchitekturen 45 Scalable Processor Architecture - SPARC - Version 9 Speichermodelle Die Speichermodelle der SPARC Architektur definieren die Semantik der Speicheroperationen. Hauptsächlich werden je nach Speichermodell unterschiedliche Forderungen an die Reihenfolge der Load und Store Operationen gestellt. Total Store Order (TSO) Das Speichermodell Total Store Order definiert, daß alle Store Operationen, also alle Schreiboperationen in den Hauptspeicher in der Reihenfolge ihrer Initiierung, also in Order ausgeführt werden müssen. Leseoperationen in den Hauptspeicher werden in der Reihenfolge ihrer Initiierung ausgeführt und sind zudem blockierend. D.h. daß aufeinanderfolgende Leseoperationen solange blockieren, bis die Zielregister beschrieben sind. Schließlich sind die atomaren Load/Store Operationen sowohl bezüglich Load- als auch Store Operationen geordnet. Der Einsatzbereich von TSO ist hauptsächlich auf Single-Prozessor-Rechner beschränkt, da die Einschränkungen dieses Modells im Multiprozessorbetrieb hohe Wartezeiten bedeuten. Total Store Order ist ein Auslaufmodell in der SPARCArchitektur, da TSO nur aus Kompatibilitätsgründen zu den SPARC Versionen 7 und 8 besteht und in künftigen SPARC Definitionen wahrscheinlich nicht mehr vorkommt. Partial Store Order (PSO) Bei dem Speichermodell Partial Store Order sind die Load Operationen untereinander, sowie die atomaren Load/Store Operationen bezüglich der Load Operationen geordnet. Load Operationen sind wie in TSO blockierend, Schreiboperationen sind jedoch nicht geordnet. Auch PSO ist ein Auslaufmodell, wird jedoch wahrscheinlich später als TSO aus den SPARC-Definitionen entfernt. Alle Programme, die korrekt im PSO Speichermodell arbeiten, arbeiten zudem auch korrekt im TSO Speichermodell. Relaxed Memory Order (RMO) Relaxed Memory Order legt bei Speicherzugriffen keine Ordnung fest, mit Ausnahme derer, die für die Konsistenz des Prozessors nötig sind. D.h., daß der Programmierer/Compiler für die Anordnung der Speicherzugriffe verantwortlich ist. Dies ist besonders im Multiprozessorbetrieb vorteilhaft, da der Programmierer die Semantik der Operationen überblickt, und nur in notwendigen Fällen die Speicherzugriffe steuert. Diese Steuerung geschieht explizit mittels MEMBAR Instruktionen, die die Zugriffe auf Speicherbereiche bis zum Abschluß der Operation blockieren kann. Da im Relaxed Memory Order Speichermodell keine Ordnung der Speicheroperationen garantiert ist, arbeiten alle Programme, die korrekt im RMO Speichermodell ablaufen auch korrekt im PSO Speichermodell und somit auch korrekt im TSO Speichermodell. Programme die im RMO Modell korrekt arbeiten, arbeiten sowohl im PSO- als auch im TSO Modell korrekt. Bild 10. SPARC Speichermodelle TSO 46 PSO RMO Seminar Moderne Prozessorarchitekturen Address Spaces Programme die im PSO Modell korrekt arbeiten, arbeiten auch im TSO Modell korrekt. Neue Programme sollten, da PSO und TSO in Zukunft nicht mehr unterstützt werden, bereits jetzt nach den Anforderungen des Relaxed Memory Order Modell entwickelt werden. Address Spaces Eine Adresse in SPARC-V9 ist ein Tupel aus einem 8-bit Address Space Identifier (ASI) und einem 64-bit byte-address Offset in den spezifizierten Adressraum. Speicher ist byte-aligned mit Zugriff auf Halbworte, der 2-byte-aligned ist, 4-byte-aligned Zugriff auf Ganzworte und 8-byte-aligned Zugriff auf Doppelworte. Die standard (Maschinen-) Wortlänge beträgt 64 bit, also das Doppelwort. Neben dem einfachen physikalischen und virtuellen Speicherzugriff und dem Zugriff auf adressierbare I/O Bereiche, unterstützt SPARC V9 bis zu 254 weitere Address Spaces. Address Spaces sind Speicherbereiche unterschiedlicher Interpretation, die sich physikalisch überlagern können, oder als Namensaliases, mit unterschiedlicher Semantik, auf die physikalisch gleichen Adressbereiche zugreifen. Address Space Identifier werden im Prozessor gesetzt und im allgemeinen Fall von der Memory Management Hardware interpretiert. Hiermit ist es möglich • auf verschiedene logische Adressräume zuzugreifen (kernel space, hardware addresses, ...) • Zugriffe des Kerns auf Speicherbereiche von Programmen zu erlauben, oder • Shared Memory einzurichten. Hierzu dienen verschiedene ASIs, nämlich protected und unprotected ASIs. Protected ASIs können nur im Supervisor Mode des Prozessors zugegriffen und verändert werden, wogegen unprotected ASIs auch im User Mode verwendet werden können. Address Space Identifier werden z.B. auch für die Implementierung der atomic Operations, wie MEMBAR oder SWAP verwendet. Dieser Modus heißt dann ASI_NUCLEUS, im Gegensatz zu ASI_PRIMARY bei normalen Speicherzugriffen. Insgesamt darf man ASIs als Adress-Aliases verstehen, die zudem die Semantik der Speicherzugriffe definieren. Hiermit können z.B. auch Trap-Operationen in einem vom restlichen System logisch disjunkten Raum mit veränderter Semantik der Speicherzugriffe ausgeführt werden. Dies ist besonders beim Debugging hilfreich, wenn der gesamte Adressraum ohne Speicherschutzmechanismen verfügbar ist. Referenz MMU Obwohl heutzutage faßt jeder Prozessor mit einer on-Chip MMU ausgeliefert wird, beschränkt sich die SPARC Architektur auf die Beschreibung einer Referenz-MMU, die wie der Name bereits sagt nur als Referenz für eventuelle MMUs existiert. Dem jeweiligen Hersteller ist überlassen, ob und wie er dem System eine MMU hinzufügt. Entsprechend ist die Beschreibung dieser ReferenzMMU einfach gehalten und verlangt kaum mehr als einfach Logik, die • virtuelle Adressen in physikalische Adressen übersetzt • Speicherschutz bietet • verschiedene Address-Spaces unterstützt • abgeschaltet werden kann (virtual Memory = physical Memory) und • eventuell Instruction prefetch betreibt. Eine SPARC-MMU betreibt Adressübersetzung, solange sie nicht ausgeschaltet ist. Hierzu liest sie aus dem Prozessor Status Register heraus, in welchem Adressierungsmodus der Prozessor arbeitet. Kann die MMU eine Speicheradresse nicht auflösen, so sendet sie dem Prozessor einen AccessMMU-miss Trap, kann auf eine Speicheradresse aus Gründen des Speicherschutzes nicht zugegrif- Seminar Moderne Prozessorarchitekturen 47 Scalable Processor Architecture - SPARC - Version 9 fen werden, so sendet die MMU einen Access-Protection Trap. Alle weiteren Eigenschaften der MMU, wie TLBs oder die Position relativ zu den Caches ist herstellerabhängig. Sun UltraSPARC-2 Suns Spitzenprozessor ist der seit 1997 verfügbare UltraSPARC-2 Prozessor, ein SPARC Version 9 konformer RISC-Prozessor, der aus einer 9-stufigen Integer-Pipeline, Floating-Point-Unit mit VIS1- Instruktionssatz sowie einer SPARC Referenz MMU besteht. Lieferbar ist der UltraSPARC2 Prozessor zur Zeit mit Taktfrequenzen zwischen 300 und 480 MHz. Der Sun UltraSPARC-2 Prozessor existiert in wenigstens zwei nicht dokumentierten, unterschiedlichen Versionen, nämlich einer älteren, in 0.35µm produzierten, nicht mit ECC-Error Correction Code ausgerüsteten Version, sowie in einer neueren Version mit ECC über alle Caches. Hergestellt in 0.25µm Strukturen und aus ca. 5,4 Millionen Transistoren bestehend belegt dieser neuere UltraSPARC-2 Prozessor ca. 156 mm² Chipfläche. Beide Prozessoren besitzen 28 Status- und Kontrollregister, 8 Register Fenster zu je 16 General-Purpose-Registern sowie 8 Trap-Level 1 Register. Bild 11. UltraSPARC II - Architectural Overview Aufgrund der geringen Transistoranzahl besitzt der UltraSPARC-2 Prozessor keine Out-Of-OrderExecution-fähigkeit. Um Synchronisationsprobleme in der Pipeline zu vermeiden operiert die FPU des UltraSPARC-2 synchron zur IEU, d.h. mit einer 9-stufigen Pipeline mit 3 Wartezyklen (siehe Bild 9). Auch bei der Branch-Prediction, verwendet Sun einen einfachen Ansatz. Die Branch-Prediction-History ist 2 bit tief, mit der folgenden Funktion Tabelle 4. Branch History Tabelle - Sun UltraSPARC-2 bit 0 bit 1 Zustand und Folgezustand 0 0 History nicht verwenden (Software-controlled) 0 1 branch was and will be taken 1. VIS - Visual Instruction Set 48 Seminar Moderne Prozessorarchitekturen Sun UltraSPARC-2 Tabelle 4. Branch History Tabelle - Sun UltraSPARC-2 bit 0 bit 1 Zustand und Folgezustand 1 0 branch was not taken, but will be taken next time. No change in prediction. 1 1 branch was not taken, and will not be taken. History changes prediction Bild 12. 9-stufige Pipeline des Sun UltraSPARC-2 Prozessors Fetch Decode Group 128 bit W o r d I n s t r u c t i o n s Execute Data load Verify Ready N1 N2 N3 Trap Write Resolution ASL 1 I1 I2 ASL 2 I3 ASL 3 Trap Write Resolution I4 FPU Visual Instruction Set (VIS TM) Das Visual Instruction Set, eine Prozessorerweiterung, die nicht in der SPARC Definition vorkommt, ist ein ähnlicher Ansatz, wie MMX bei Intel. Die FPU übernimmt mit einem erweiterten Instruktionssatz zusätzliche Aufgaben. Diese beschränken sich auf 64-bit RGBa-Berechnungen. Hierbei wird jeder Bildpunkt in 4x16 bit codiert (16 bit jeweils für Rot, Grün, und Blau, sowie 16 bit Alphablending). Auf diesem 64-bit Wort wird dann eine SIMD Berechnung ausgeführt. Das Ergebnis wird FPU-typisch von der IEU wieder gelesen, bzw. in neue Speicherbereiche geschrieben. Tabelle 5. VIS Instruktionen (1) FPADD16 / FPSUB16 4x16-bit Partitioned Add/Substract Instructions FPPACK16 / FPPACK32 4x16-bit / 2x32-bit Pixel Pack FPEXPAND Clips 4x16/2x32-bit Integer Values to 4x8-bit Integer Values 4x16-bit Pixel Expand Expandiert 4x8-bit Integer nach 4x16-bit Integer Werten FPMERGE 2x32-bit Merges Transformiert 2 32-bit RGBa Werte in einen 64-bit RGBa Wert Bild 13. VIS Instruktionen (2) Seminar Moderne Prozessorarchitekturen 49 Scalable Processor Architecture - SPARC - Version 9 Weitere Instruktionen zum Vergleichen, Transformieren, Multiplizieren und Dividieren von Pixelpacks und 8-bit, 16-bit, und 32-bit Teilworten sind verfügbar. Hiermit können komplexe Operationen, z.B. packed -> planar, ausgeführt werden. Nachteil ist wie auch bei MMX, daß während der Ausführung von VIS-Instruktionen die verwendeten Register der FPU nicht für eigentliche Floating Point Operationen zur Verfügung stehen. Da die SPARC FPU 32 64-bit Register besitzt, ist hier jedoch das Aufteilen der Register auf VIS-Instruktionen und Floating Point Instruktionen einfacher zu handhaben. Fujitsu/HAL SPARC64-GP Fujitsus Top-Prozessor der SPARC-Serie ist der SPARC64-GP, ein direkter Nachfolger des SPARC64. Der SPARC64-GP ist ein mit 272 MHz getakteter SPARC Version 9 konformer RISCProzessor mit 17,5 Millionen Transistoren, der in 0,25µm Strukturen gefertigt wird. Er besitzt ein volles Out-Of-Order-Execution Modell, 52 sichtbare Kontroll- und Statusregister, sowie 5 GeneralPurpose-Registerfenster zu je 16 Registern. 28 dieser 52 Register werden für Hardware-Performance-Monitoring verwendet Tabelle 6. Hardware Performance Monitore des SPARC64-GP Memory Access Latency Counters Memory Access Event Counters L1-Cache Access Event Counters L2-Cache Access Event Counters MMU Event Counters Instruction Execution Rate Counters Issue Stall Counters Branch Prediction Counters Weiterhin besitzt er die obligatorischen 8 Fast-Trap Register und 34 freie Register, die für RegisterRenaming, also das Bereitstellen frischer Register in der Out-Of-Order Execution benötigt werden. Hiermit können bis zu 63 Instruktionen Out-Of-Order bearbeitet werden, die erst in der letzten Stufe der Pipeline synchronisiert werden. Bild 14. 50 SPARC64-GP Architectural Overview Seminar Moderne Prozessorarchitekturen Vergleich Sun UltraSPARC-2 und Fujitsu/HAL SPARC64-GP Im Gegensatz zum Sun UltraSPARC-2 Prozessor besitzt der SPARC64-GP zwei Integer Functional Units, eine für Fixed-Point Integer Operationen, eine weitere für Fixed-Point Integer Operationen und Adressoperationen. Jede dieser Einheiten besteht aus zwei ALSs (Arithmetic Logic Shift Units), die parallel zueinander operieren. Zudem besitzt der Prozessor zwei Floating-Point Einheiten die aus jeweils einem Floating-Point Multiply-Adder und einem Floating-Point Divider bestehen, so daß bis zu 4 Floating-Point Operationen parallel ausgeführt werden können. Um auch hier Out-Of-Order Operationen zu unterstützen, besitzen die FPUs die in SPARC Version 9 definierten 32 Floating-Point Register, sowie weitere 32 Rename Register. Zwei Load-/Store-Units, die für eine durchschnittliche Beschleunigung des Speicherdurchsatzes um den Faktor 1.5 im Vergleich zu einer LSU, verantwortlich sind beliefern den Prozessor mit Instruktionen und Daten. Im Gegensatz zur Sun UltraSPARC operieren die FPUs nicht synchron zur IEU, sondern besitzen eine nur 4 Cyclen tiefe Pipeline. Der Fujitsu/HAL SPARC64-GP besitzt keine On-Chip MMU, was durch die Verwendung mehrstufiger TLBs ausgeglichen wird. So besitzt der SPARC64-GP drei µTLBs mit je 32 Einträgen, einen für Instruktionen und zwei µTLBs für Daten, sowie TLBs mit 256 Einträgen ebenfalls sowohl für Instruktionen wie für Daten. Hiermit unterstützt der SPARC64-GP Seitengrößen des Speichers zwischen 4 KByte und 4GByte. Außerdem wurde ein sogenannter Level-0 Cache für Instruktionen eingeführt, der 16 KByte groß ist und zwischen Instruktion-Buffer und Level-1 Cache angesiedelt ist. Insgesamt legten die Entwickler des SPARC64-GP stärkeren Wert auf eine permanent gefüllte und operierende Pipeline, was viele große Caches, parallele Einheiten und eine hochentwickelte 2-stufige Branch-Prediction Unit zur Folge hat. Circa 11 Millionen der 17,5 Millionen Transistoren des Prozessors werden in Caches und Puffern eingesetzt. Um die Größe des Prozessor-dies so zu gestalten, daß er in der Ultra-Port-Architecture (UPA), einer von Sun definierten Prozessor-Bus Schnittstelle, eingesetzt werden kann, verzichtete man auf eine On-Chip MMU. Sie ist als externer Chip mit weiteren, beschleunigenden Eigenschaften, wie getrenntem Memoryund Cache-Bus und vergrößerten TLBs implementiert. Vergleich Sun UltraSPARC-2 und Fujitsu/HAL SPARC64-GP Obwohl der Sun UltraSPARC-2 Prozessor mit überlegenen Taktfrequenzen operiert, kann man die 360 MHz Version mit Fujitsu/HALs SPARC64-GP Prozessor mit 272 MHz vergleichen. Trotz des um ein drittel höheren Takts des UltraSPARC-2 Prozessors schneidet der SPARC64-GP sowohl in der Integer- als auch in der Floating Point Leistung nach SPECint95, bzw. SPECfp95 besser ab. Dies liegt hauptsächlich an der besseren Ausnutzung der Pipeline durch große Caches und der OutOf-Order-Execution Fähigkeit des HAL-Prozessors. Allerdings besitzt der UltraSPARC-2 Prozessor einen einfacheren Aufbau. Der SPARC64-GP muß mehr als die dreifache Transistorzahl mit Spannung versorgen um die erhöhte Leistung zu erbringen. Zudem ist Fujitsu/HALs Prozessor auf den Bereich der Server-Systeme ausgelegt, was unter anderem an der möglichen sehr großen Seitengröße von 4 GByte erkennbar ist (typische Anwendung Datenbankrechner). Bild 15. Vergleich der Leistungsdaten Seminar Moderne Prozessorarchitekturen 51 Scalable Processor Architecture - SPARC - Version 9 Trotz der Vielzahl gemeinsamer Parameter, sind die Prozessoren jedoch nicht wirklich vergleichbar. Suns Prozessor ist für den Bereich der Hochleistungs-Workstation gebaut worden, der HALProzessor ein echter Server Prozessor, z.B. auch ohne VIS. Da speziell RISC-Rechner von hochentwikkelten Compilern profitieren, die die Nutzung der Pipeline optimieren, ist der SPARC64-GP zwar auf dem Papier einem UltraSPARC-2 Prozessor überlegen, da er die Ordnung des Programmcodes in Hardware reorganisiert, hochentwickelter und optimierter Code benötigt diese Reorganisierung aber kaum, da Code Reorganisation faßt nur bei schlechten Compilern, altem Code oder bei Floating Point Instruktionen verwendet wird. Appendix Die Definition im „SPARC Architecture Manual Version 9“ auf Seite 18 Paragraph 3.2.1.4 schreibt zur Harvard-Architektur und Programmen die ihren Code selbst modifizieren: „For this reason, programs that modify their own code (self-modifying´code) must issue FLUSH instructions, or a system call with a similar effect, to bring instruction and data memories [caches] into a consistent state.“ Quellen [SPARC 1994] David L.Weaver, Tom Germond: SPARC Architecure Manual Version 9, SPARC International, Prentice-Hall [SPARC 1987] David L. Weaver: SPARC Architecture Manual Version 8, Sparc International, PrenticeHall [Tanenbaum 1990] Andrew S. Tanenbaum: Structured Computer Organization, Prentice-Hall International [HAL 1998] SPARC64-GP, HAL/Fujitsu, http://www.hal.com/ [Sun 1997] SPARC Users Manual, 1997, Sun Microsystems, http://www.sun.com/ 52 Seminar Moderne Prozessorarchitekturen K APITEL 6 MIPS-Familie Matthias Brust Die Firma MIPS MIPS Technologies ist der Nachfolger des Prozessorgeschäfts von MIPS Computer Systems, Inc., welches 1984 gegründet und 1992 von Silicon Graphics, Inc. an sich gezogen wurde. Silicon Graphics, Inc. hält mehr als 80 Prozent Eigentum von MIPS Technologies, Inc. Durch Entwicklungen auf dem embeddet Markt arbeitet MIPS mit vielen namhaften Firmen zusammen, wie beispielsweise Broadcom Corporation., LSI Logic Corporation, NEC Corporation, Philips Semiconductors, Texas Instruments, Toshiba Corporation, Commquest (IBM), Sony Corporation. Geschäftliche Ziele von MIPS Technologies, Inc. MIPS Technologies, Inc. entwickelt kostengünstige high-performance 32- und 64-bit RISC (reduced instruction set computing) Prozessoren für den Endbenutzer und den high-end embedded Markt. Entwicklungen von MIPS Technologies sind Bestandteile von Produkten wie beispielsweise Video-Spielkonsolen, Set-top Boxen, Digitalen Kameras, und handlichen Rechengeräten, die Mircosoft Windows CE unterstützen. Endverbraucher und der embedded Markt MIPS Technologien können in einem großen Anwendungsbereich von Video Games, wie z.B. Nintendo 64 und die PlayStation Spielekonsole gefunden werden. Aber auch in Network Computers von Tektronix und in Network Computing Devices, Inc.; handlichen Geräten unter Benutzung von Microsoft Windows CE und Philips Velo 500, Samsung PalmPC und NEC® MobilePro 750c; und digitalen set-top Boxen von General Instruments, EchoStar Communications Corporation und WebTV. Aber auch in anderen Andwendungen von arcade games, Kommunikationsgeräten und mehr. High-end embedded Produkte Die MIPS-Architektur entfaltet seine Kraft in einer Reihe von Anwendungen wie Laser-Drucker von Hewlett-Packard, Okidata und Lexmark sowie zahlreiche Kopierer, genauso wie Router von Cisco, Bay Networks und mehr. Seminar Moderne Prozessorarchitekturen 53 MIPS-Familie MIPS Höhepunkte Heute gibt es mehr als 35 seperate Team zur Entwicklung MIPS-basierter Produkte. Es existieren mahr als 80 verschiedene MIPS Prozessoren, die entwickelt wurden und vermarktet werden von MIPS Technologies, Inc. und/oder den Partnern. Folgend kurz eine Auflistung der Höhepunkte von MIPS. • 1991: R4000TM erster (!) kommerzieller 64-bit Microprozessor. • 1995: R4700TM ernannt zum "Microprocessor of the Year" von Microprocessor Report. • 1996: MIPS wurde zur größten und am schnellsten wachsenden RISC Architektur in der Welt mit 19.2 Millionen Prozessoren. MIPS verzeichnete mehr als 10faches Wachstum von 1994 bis 1996. • 1997: MIPS Vertragspartner verkauften 48 Millionen Prozessoren und MIPS wurde dadurch die erste RISC Architektur in der Geschichte, die Motorola's 32-bit 68000 CISC Einheit übertraf. • 1997: NEC's MIPS RISC VR4300TM wurde zum "Microprocessor of the Year" ernannt von Microprocessor Report. • 1998: MIPS Technologies, Inc. gab Aktion raus. Die Firmenstrategie ist den Endverbraucher anzusprechen und die bereits vorhandene Position im traditionellen embedded Mark verstärkt auszubauen. Nennenswerte MIPS-Prozessoren R4000. Der R4000 ist ein 64-bit Prozessor. Auf ihm können jedoch auch problemlos 32-Bit Applikationen laufen. Selbst dann, wenn der Prozessor im 64-bit Operationsmodus läuft. R4000 Highlights • 64-bit On-chip Floating-point Unit (FPU) • 64-bit Integer Arithmetic Logic Unit (ALU) • 64-bit Integer Register • 64-bit Virtueller Adressraum • 64-bit Systembus R4300. Der MIPS R4300 ist ein high-performance, low-cost RISC Mikroprozessor, der für den kostengünstigen embeddet Markt entworfen wurde. R4300 Highlights • 64-bit Architektur • 3.3V, 100+MHz, 1.8W R5000. Der MIPS R5000 Mikroprozessor ist ein echte 64-bit Implementierung der MIPS IV Architektur und ist ISA kompatibel mit der R4000 Familie. Der R5000 besitzt On-chip-1st Level Caches, 32KB Instruktion und 32KB Data. R5000 Highlights • 2-way superskalare Pipeline • Accelerates 3D graphics • MIPS IV ISA kompatibel 54 Seminar Moderne Prozessorarchitekturen Der MIPS 10000 Prozessor Der MIPS 10000 Prozessor Leistungsmerkmale Der R10000 ist ein Einchip superskalarer RISC-Mikroprozessor, der eine konsequente Weiterentwicklung der Prozessoren R2000, R3000 (Embedded Systems), R6000, R4400 (bekannt aus NintendoTM und Freunden) ist. Skalierbarkeit bezeichnet die Möglichkeit, die Zahl der Prozessoren mit dem tatsächlichen Rechenbedarf zu erweitern, ohne daß eine andere Betriebssoftware erforderlich wird. Neben der dynamischen Erweitbarkeit eines Rechnersystems ist auch einer Reduktion der Zahl der Prozessoren im laufenden Betrieb von Wichtigkeit, da bei großen Prozessorzahlen die Wahrscheinlichkeit eines Prozessorausfalls erheblich zunimmt. Die Skalierbarkeit erlaubt in solchen Fällen die Fortsetzung des Betriebs mit einer geringeren Zahl von Prozessoren. Diese Konzeption erhält allerdings dadurch einen empfindlichen Dämpfer, daß bei der effizienten Verteilung einer Berechnung auf mehrere Prozessoren die Laufzeit durch die Zahl der verfügbaren Prozessoren sowie die Art ihrer Kommunikation erheblich beeinflußt wird. Der Ausfall von einem oder mehreren Knoten kann dann über die Leistungsreduktion hinaus zu zusätlichen Leerzeiten der verbleibenden Prozessoren und damit zu einer substantiellen Verschlechterung des Durchsatzes führen. Deshalb wird der Wert einer Skalierbarbeit in erster Linie für die Bearbeitung unabhängiger Aufträge, als den Multiprogrammierungsbetrieb, gesehen. Der R10000 wurde in der MIPS ANDES -Architektur realisiert, was ausgeschrieben heißt Achitektur with Non- sequential Dynamic Execution Scheduling oder Architektur mit nicht-sequentieler Befehlsausführung. Fakten Als Haupteigenschaften des MIPS R10000 sind zu nennen: • 64-Bit Architektur • Kerntakt bis 200 MHz • 599-Pin Ball-grid-Array • max. 30 Watt Leistungsaufnahme • Implementierung mit dem MIPS IV - Befehlssatz ( naheliegend, die vierte, erweterte Version von MIPS I ) • Voll Kompatibel zu älteren MIPS-Befehlssätzen, d.h. es können auch ältere 32-Bit Applikationen ( MIPS I , MIPS II ) ausgeführt werden ( auch neben 64-Bit Applikationen ) • Dekodierung von bis zu vier Befehlen pro Zyklus und Übergabe in entsprechende Warteschlangen vor den Ausführungseinheiten • fünf Ausführungseinheiten: zwei Integer-Einheiten zwei Floatingpoint-Einheiten eine Load/Store-Einheit • in jeder der fünf Ausführungseinheiten ist eine Pipeline vorhanden • Unterstützung von Registerrenamig • Unterstützung von dynamischer Befehlsverteilung und Out-Of-order-Execution • Spekulative Ausführung von Befehlen nach einem Sprung gemäß einer Vorhersage, miss-prediction-recovery in einem Zyklus • Präzise Zuordnung von Unterbrechungen zu ihren verursachenden Befehlen Seminar Moderne Prozessorarchitekturen 55 MIPS-Familie • Nichtblockiernde Cache-Interfaces mit Prefetchfunktion • Primär-Cache ist zweifach assoziativ und für Daten und Code jeweils 32K-Byte groß • Sekundäres Cache-interface/-controler, zweifach assoziativ • Systeminterface mit Multiprozessorunterstützung, nicht blockierend • Fehlerkorrektur für Cache-Bus und Systembus • Hardware-Debugging-Interface ( JTAG ) • Hergestellt in 0,35 mikron CMOS-VLSI-Technologie, mit ungefähr 6.7 millionen Transistoren Das Schema des MIPS R10000 zeigt seine grundsätzlichen Strukturen. Es sind deutlich die Piplines, sowie der Taktgeber in der unteren Bildhälfte zu erkennen. Auf der oberen Bildhälfte befinden sich die Caches. Der 1st Level Cache sitzt auf dem Prozessorchip, während sich der 2nd LevelCache außerhalb befinden. Auf die genaue Arbeitsweise soll folgend eingegangen werden. CACHE-Design und Zugriffsstrategien Der Prozessor verfügt über einen für Daten und Befehle getrennten 1st-Level- Cache mit einer Größe von jeweils 32 KB. Beide Casches sind zweifach assoziativ. Der Befehlscache hat eine feste Zeilenlänge von 16 Words, der Datencache eine von 8 Words. Für den 2nd-Level-Cache ist ein Cachecontroler mit Unterstützung für Multiprocessing im Chip vorhanden, der von 512 KB bis zu 16 MB groß sein kann und ebenfalls zweifach assoziativ ist. Die Länge der Cachezeilen ist zu 16 oder 32 Words konfigurierbar und bei einer Konfiguration zu 32 Word und einer Gesamtgröße bis 2 MByte wird der korrekte Cache-Weg statistisch vorhergesagt. Alle Cacheebenen arbeiten nach dem Writeback-Algorithmus und mit einer LRU-Strategie. 56 Seminar Moderne Prozessorarchitekturen Der MIPS 10000 Prozessor LRU bedeutet least recently used: Die am längsten nicht benutzte Daten werden als Kandidat prognostiziert, auf die auch in Zukunft am längsten nicht mehr zugegriffen werden soll. Daneben gibt es noch FIFO und LFU, die, um der Theorie Rechnung zu tragen, hier erklärt werden sollen. FIFO (first-in, first-out): Die Daten, welche am längsten im Speicher stehen, werden ausgelagert. LFU (least frequently used): Die Daten, welche am wenigsten oft benutzt wurden, werden ausgelagert. Im Fall eines Miss-on-Cache-Write kommt eine sogenannte Fill-on-write- miss-Strategie zum Einsatz, die nach o.g. Mechanismus Platz im 1st-Level-Cache schafft, um die Daten möglichst schnell loszuwerden. Beim zyklischen Write- Back geschieht dieses nach gleichem Prinzip im 2nd-LevelCache, es wird dort Platz geschaffen und später erst in den Hauptspeicher geschrieben. Folglich gibt es diesem Prozessor keinen Write-through, mit Ausnahme von Bereichen für die das Caching deaktiviert wurde. Für Speicherbereiche mit deakiviertem Cache gibt es noch die Möglichkeit eine uncached-accelerated-Strategie zu benutzen, die vier Speicherzugriffe abpuffert und diese dann gesammelt, wenn möglich im Blockmode, zurückschreibt. Dieses ist besonders für Zugriffe auf Videospeicher von Interesse, wo der Videochip zur Darstellung immer die aktuellen Daten braucht und nicht darauf warten kann, das die Daten die Caches durchlaufen hat. Der uncached-Mode ist notwendig, da der Prozessor memory-mapped-IO für die Anbindung von Peripheriegeräten, wie z.B. eine PCI-Bridge, benutzt. Seminar Moderne Prozessorarchitekturen 57 MIPS-Familie Eine besondere Eigenschaft der Caches ist die Ausführung als nicht blockierender Cache, was es ermöglicht während eines Cache-Refills, sei es nun aus dem 2nd- Level-Cache oder aus dem Hauptspeicher, weiter auf den Cache zuzugreifen. Da- durcher wird ein Anhalten der Pipelines weitestgehend ausgeschlossen. Während des Cache-Refill für den 1st-Level-Instruction-Cache ( bzw. beschreiben ) wird darüber hinaus ein Predecode ausgeführt, der den Aufwand an späterer Stelle minimiert. Die Pipelines Der Prozessorkern ist in einem superskalaren Design ausgeführt und arbeitet mit insgesamt sechs weitestgehend unabhängigen Pipelines und ebenso vielen Ausführungseinheiten. Für jede der Operationstypen, Integer, Float und Load/Store, steht eine Warteschlange für Befehle zur Verfügung. Für letztere steht eine streng nach dem FIFO-Prinzip geordnete Warteschlange bereit um Speicherabhängigkeiten und Datenkonsistenz zu gewährleisten. Die anderen beiden sind keiner strengen Ordnungsregeln unterworfen. Es verläßt ein Befehl dessen Abhängigkeiten, in Bezug auf Operanden, erfüllt sind, die Warteschlange und wird ausgeführt. Jede der beiden Einheiten verfügt über ein Registerfile mit 32 logischen Registern zu 64 Bit, die auf 64 physikalischen Registern abgebildet werden. Zu jedem physikalischen Register gehört immer nur ein Wert. Wird auf ein logisches Register eine Operation ausgeführt, so wird das Ergebnis in ein nicht zugewiesenes Register geschrieben. Nachfolgend die sieben Stufen der 4-Wege-Pipeline (vier Befehle gleichzeitig): Stufe 1: Diese Stufe holt pro Zyklus bis zu 4 Befehlen, unabhängig, wie sie innerhalb einer Cachezeile ausgerichtet sind. Die einzige Einschränkung besteht darin, daß der Prozessor nicht über die Grenze einer Cachezeile laden kann. 58 Seminar Moderne Prozessorarchitekturen Der MIPS 10000 Prozessor Stufe 2: In der 2. Stufe werden die Befehle dekodiert und die Operandenregister, die durch logische Adressen referenziert werden, umbenannt, d.h. an ihrer Stelle die physikalische Adresse eingetragen und als benutzt markiert. Des weiteren wird ein freies Register reserviert, das das Ergebnis des Befehls aufnimmt. Stufe 3: In dieser Stufe werden die Befehle in die Warteschlangen vor den Ausführungseinheiten eingetragen. In dieser Stufe beginnt die eigentliche Befehlsausführung. Stufen 4-6: In den Stufen 4-6 werden die eigentlichen Operationen ausgeführt. Für die einzelnen Ausführungseinheiten stehen verschieden Pipelines zur Verfügung. • Floating-Point-Multiplizierer Diese Pipeline ist 3-stufig. In ihr werden Multiplikation und bedingte Speicherbefehle für einfach und doppelte Genauigkeit mit einer Wiederholrate von 1 Zyklus und einer Latenzzeit von 2 Zyklen ausgeführt. In der dritten Stufe wird das Ergebnis in das Zielformat gepackt und in das Registerfile zurückgeschrieben. • Floating-Point-Dividierer und Radizierer Diese Einheit hat keine Pipeline im eigentlichen Sinn. Vielmehr verwendet sie die Recheneinheiten der Multiplizierereinheit und arbeitet iterativ. Sie ist in der Lage Divisionen und Radizierungen parallel auszuführen. • Floating-Point-Addierer Auch diese Pipeline ist 3-stufig. In ihr werden Additionen, Subtraktionen Vergleiche und Formatwandlungen mit einer Wiederholrate von 1 Zyklus und einer Latenzzeit von 1 Zyklus ausgeführt. • Integer-Einheit 1 Diese Pipeline ist, soferner man davon sprechen kann, 1-stufig. Diese Stufe führt Additionen, Subtraktionen, logische Operationen und die Auswertung der Sprungvorhersage aus. Die Latenzzeit ist 1 Zyklus und die Wiederholrate ebenfalls 1 Zyklus. • Integer-Einheit 2 In dieser, ebenfalls 1-stufigen, Pipeline werden Additionen und Subtraktionen sowie Multiplikationen und Divisionen durchgeführt. Die Latenzzeit ist 1 Zyklus und die Wiederholrate ebenfalls 1 Zyklus für Addition und Subtraktion, ansonsten deutlich höher, nach Tabellen bestimmbar. • Load/Store Diese Einheit hat einen 16-Einträge-Stack um ebenso viele Speicherzugriffe nicht blockierend auszuführen. Sie verfügt über ein eigenes 44-Bit Adressrechenwerk für logische Adressen und einen 64 Einträge großen TLB, der vollassoziativ ist. Stufe 7: In dieser Stufe beenden die Befehle gemäß ihrer ursprünglichen Programmreihenfolge. Es können bis zu 32 Befehlen außerhalb ihrer Reihenfolge behandelt werden. Register-Renaming Registerrenaming ist eine Methode um auf relativ einfache Art und Weise Operandenabhängigkeiten zu überprüfen und die spekulative Ergebnisse von Befehlen reversible zu machen. Die Implementierung im R10000 macht von dieser Methode sehr aggressiv Gebrauch. Wie oben erwähnt, besitzt der Prozessor zwei Registerbänke zu 32 logischen, die auf 64 physikalische Register abgebildet werden und im Bezug auf das Renaming identisch sind. Beim Renaming werden im ersten Schritt logische Registeradressen gegen physikalische Adressen ersetzt und dem Zielregister ein neues physikalisches Register zugewiesen. Das Originalregister und dessen logische Adresse werden bis zur Befehlsbeendigung durch die siebte Stufe der Pipeline zwischengespeichert. Dadurch ist es möglich Befehle außerhalb ihrer Reihenfolge zu bearbeiten und die produzierten Ergebnisse gemäß der Programmreihenfolge in die Registerfiles zu schreiben. Ferner ist das Abbrechen eines spekulativ ausgeführten Befehles möglich wie sie bei bedingten Sprüngen auftreten. Seminar Moderne Prozessorarchitekturen 59 MIPS-Familie Spekulationen und Vorhersagen Die Entwickler des Prozessors sind wahrscheinlich nach dem Prinzip vorgegangen, das man so ziemlich alles vorhersagen kann. Die in diesem Zusammenhang herausragende Funktion ist die speculativ execution. Der Prozessor führt intern eine Sprungvorhersage nach einem statistischen 2Bit-Kriterium aus und führt die Befehle entlang des Vorhergesagt Pfades aus. Es wird die Sprunggeschichte der letzten 512 ausgeführten Sprünge protokolliert. Er ist in der Lage bis zu vier falsch vorhergesagte Sprünge zu revidieren, was durch den Mechanismus des Registerrenaming vereinfacht wird. Beim Abbruch oder rückgängig machen einer Operation wird dem logischen Ergebnisregister sein ursprüngliches physikalisches Register wieder zugewiesen und somit das Ergebnis verworfen. Des weiteren trifft der Prozessor Vorhersagen darüber, wo in dem, wie Eingangs erwähnt 2-fach assoziativen, Cache die Daten liegen. Er ist in der Lage bis zu einer Cachegröße von 2 MByte und einer Zeilenlänge von 32 Words Vorhersagen zu machen. Laut Entwicklerangaben ist der Performancegewinn größer als wenn man mehr Cache verwendet. Systeminterface Die Schnittstelle zum Chipsatz, der hier external-agent heiß, und zu anderen Prozessoren besteht im wesentlichen aus einem 64-Bit Adress-/Daten-Multiplexbus, einem 12-Bit Commandbus und einer Anzahl von Signalen zur Datenflußkontrolle. Das Interface ist asynchron und nicht blockierend, was durch mehrere Pufferspeichern, teils auch FIFO's, realisiert wird. Darunter befindet sich auch die Logik für den oben erwähnten uncached accelerated-Mode. Ferner unterstützt das Interface auch das Multiprocessing in zwei verschiedenen Arten: • Multiprocessing using dedictated extrenal agents Diese Variante findet Anwendung bei großen Rechner-Arrays, wo man deutlich mehr Leistung braucht, als man es aus einem Computer in Big-Tower-Größe erwarten könnte. Es können hiermit beliebig (annähernd) viele Prozessoren verbunden werden. Jeder von ihnen muß über einen exteranl agent verfügen, der für die Kommunikation mit dem Hauptspeicher, der I/O und den anderen ea verantwortlich ist. Es muß selbstverständlich dafür sorge getragen werden, das die Verbindung der ea kohärent ist. • Multiprocessing using a Cluster-bus Dieses ist die einfachere Variante, wo 2-4 Prozessoren direkt am Systeminterface verbunden sind und sich den ea, der Jet cluster-coordinater heißt, teilen. Die Verteilung der Zugriffsrechte wird mit den drei Signalen SysRequest, SysRelease und SysGrant durch den cluster-coordinater gesteuert. In beiden der Betriebsarten werden folgende drei Kohärenzprotokolle unterstützt: • snoopy-based Die Prozessoren im Slave-Mode ,"schnüffeln" auf dem Bus und reagieren, je nachdem, ob sie angesprochen sind oder nicht. Dieses ist das einfachste aller Protokolle mit dem geringsten Hardware-Aufwand, aber auch das langsamste. Jeder Prozessor, wenn er nichts mit den Informationen auf dem Bus anfangen kann, muß dieses dem aktuellen Master-Prozessor mitteilen, was bei drei Slaves einen beträchtlichen Protokoll-Overhead ausmacht.. • snoopy-based with external duplicate tags and control Bei diesem Protokoll melden sich Slave-Prozessoren nur, wenn sie vom cluster- coordinater angesprochen werden. Selbiger besitzt eine Kopie aller 2nd-Level- Tags im Cluster und weiß somit, ob sich ein angefordertes Datum in einem der Slave-Caches befindet. Wenn dem so ist, dann gibt er die Anfrage an den entsprechenden Prozessor weiter, der dem Auftraggeber einen Response liefert, ansonsten wird ein Hauptspeicher ausgeführt. Der Protokoll-Overhead sinkt auf dem Bus und der Hardware-Aufwand beim vom cluster-coordinater steigt. 60 Seminar Moderne Prozessorarchitekturen Ein Vergleich zum MIPS R12000 • directory-based with external directory structure and control Über dieses Protokol schweigt sich die Dokumentation weitestgehend aus. Sie ist den duplicated Tags ähnlich. Es werden zusätzlich Informationen über den Prozessor gehalten. Welcher Cache hält welche Einträge. Die external agents oder cluster-coordinater sind nicht wie bei anderen Prozessoren erhältlich. Sie werden in der Regel nach eigenen Bedürfnissen von dem Systemdesigner entworfen und in ASIC's realisiert. Ein Vergleich zum MIPS R12000 Der MIPS R12000 stellt eine direkteWeiterentwicklung des MIPS R10000 dar. Es wurden einige kleine Verbesserungen vorgenommen, die die Prozessor-Performance insgesamt auf über 23 % gegenüber dem MIPS R10000 erhöhte, und dadurch eine eigene Prozossornummer rechtfertigt. Auszugsweise werden jetzt diese Verbesserungen vorgestellt. Beim MIPS R12000 wurde die Active List von 32 Einträgen auf 48 Einträge erhöht. Diese Erweiterung erlaubt mehr Befehlen entweder in der Liste auf ihre Ausführung zu warten oder Ausgeführt zu werden. Bei einem Branch, erlaubt diese dem Prozessor spekulativ mehr Befehle auszuführen, was auch tiefere Spekulation genannt wird. In den allermeisten Situationen, erhöhen diese beiden Effekte die Anwendungs-Performance. Wenn der MIPS R10000 Daten vom Systembus zu dem zweiten Cache transferierd, wird der Cache-Controller für eine Weile lahmgelegt, bis die komplete CacheZeile vom Hauptspeicher eingelesen wurde. Da der Systembus-Takt entscheidend langsamer ist als der Prozessortakt, kann ein ganzer Zeilenübertrag für den zweiten Cache eine Ruhepause von einigen Duzent Zyklen bedeuten. Während dieser Zeit keine andere Anfrage kann beanwortet werden. Beim MIPS R12000 ist der Transfer einer Cachezeile vom Systembus zum zweiten Cache in zwei Unterblöcke geteilt, vier für den Datencache und drei für den Instruktionencache mit freien Zyklen zwischen jedem Unterblock. Während diesen Zyklen können andere Operationen initiert werden vom zweiten Cache Controller. Wenn Daten vom Systembus kommen während dieser Zeit, werden sie gespeichert bis der Transfer vorbei ist. Insgesamt reduziert diese Veränderung den Zeitverbrauch der anderen Operationen. Das hilft ganz besonders den Anwendungen, die permanenten Miss auf den ersten und zweiten Cache haben. Seminar Moderne Prozessorarchitekturen 61 MIPS-Familie Zwei Veränderungen verbessern den MIPS R12000 bezüglich seiner Performance bei BranchBefehlen. Erstens die 4fache Erweiterung der Voraussagetabelle erhöht die Genauigkeit. Zweitens, ein 32einträgiger Target Adress Cache produziert die Zieladressen für Branch-Befehle. Beim MIPS R10000 jeder Branch verursacht einen 1 Leerlaufzyklus in der Pipline, während die Zieladresse berechnet wird. Der Leerlauf wird eliminiert, wennimmer der Branch einen hit auf das Zielcache macht. Branch-Befehle können von 15 % bis 20 % der gesamten auszuführenden Instruktionen einer Anwendung ausmachen. Deshalb ist die Vergrößerung der Branch Prediction Table und die Branch Target adress Cache ein großer zur allgemeinen Verbesserung der Anwendungs-Performance. Der MIPS R10000 kann keine Instruktionen dekodieren, wenn die Adress-Warteschlange voll wird. Beim MIPS R12000, alle load, store, cacheop, und prefetch Instruktionen werden zu der Integer-Warteschlange gesendet und in der Address calculation Unit veröffentlicht. Sie werden dann aus der IntegerWarteschlange in die load/store Warteschlange plaziert. Obwohl dadurch zusätzliche Instruktionen in die IntegerWarteschlange kommen, werden sie normalerweise sehr schnell weitergeleitet. Diese Veränderung vereinfacht beträchtlich das Design dieser Prozessorkomponenten ohne die Anwendungs-Performance zu verändern. Quellenangaben [1] www.mips.com [2] www.sgi.com [3] www.sgi.de [4] Hennessy and Patterson: Computer Architecture - A quantitative Approach (1996) [5] Kane, G.: MIPS RISC Architecture, Prentice-Hall (1988) 62 Seminar Moderne Prozessorarchitekturen K APITEL 7 ARM & relatives Heng Yiu Chau Ein wenig Historisches Die Wiege der ARM-Prozessoren ist in der Firma Acorn Electronics zu finden, welche 1978 von Adam Curry und Hermann Hauser in England gegründet wurde. Großgeworden ist die Firma mit der Herstellung von 8-Bit Homecomputern, von denen der BBC Micro-Rechner (’82) wohl als der Durchbruch bezeichnet werden kann. Dieser, in Kooperation mit der Sende-Anstalt BBC verkaufte Rechner wurde in fast allen Schulen installiert, als Begleitwerk für edukativen BBC-Sendungen. Auch als Homecomputer verkaufte sich der BBC Micro formidabel. BBC Micro's Features, wie Networking, (Pseudo)Multiprozessorbetrieb...., waren ein frühes Zeichen für die Innovativität, Creativität und den Mut der Firma Acorn. Als aber 16Bit und 32Bit Prozessoren auf dem Markt erschienen, sogar im Homecomputerbereich Einzug hielten, und graphische Benutzeroberflächen (LISA) immer mehr salonfähig wurden, neigte sich die 8-Bit Ära dem Ende zu, angesichts des für Windowing Systeme erforderlichen Rechenpowers. Acorn war sich darüber im Klaren, daß ein Nachfolger der BBC micro's hermußte. Außerdem wollte Acorn den Personal Computer Markt ("Business class") im Angriff nehmen, wo der Poweruser sicherlich sich einen performanten Computer wünscht. Man nahm sich fast alle 16- und 32-Bit Prozessoren, die auf dem Markt verfügbar waren, unter die Lupe, fand aber leider keinen geeigneten. Bemängelt wurde meistens deren zu komplexer Instruction set, niedrige Daten-Bandbreite und langsame Interruptbehandlung. Nachdem man keinen Nachfolger für den Rockwell CPU 6502, einen einfach gestrickten 8-Bit Prozessor, dessen Simplizität und Mächtigkeit man bei Acorn sehr schätzte, finden konnte, faßte man den kühnen Entschluß, einen eignen 32Bit RISC-Prozessor zu entwickeln. Begeistert von der RISC-Philosophie wurde 1983 ein, in Chipdesign unerfahrener Entwicklungsteam unter der Leitung von Steve Furber zusammengetrommelt, bestehend aus Acorn Entwicklern und RISC-Forschern der Berkeley University, mit Verstärkung in Form erfahrener Hardware-Designer aus dem Hause VLSI. Natürlich konnte nach anderthalb Jahren Entwicklungszeit hieraus nur etwas Simples und Kleines entstehen, aber dies war durchaus in Acorns Sinne, wie der folgende Zitat Hermann Hausers belegt: "... when we decided to do a microprocessor on our own, I made two great decisions - I gave them two things which National, Intel and Motorola had never given their design teams: the first was no money; the second was no people. The only way they could do it was to keep it really simple.". Voller Stolz taufte Acorn den 1. kommerziellen RISC-Prozessor Acorn RISC Machine oder ARM. Seminar Moderne Prozessorarchitekturen 63 ARM & relatives Die hatte in der Tat auch Vorteile; kürze Entwicklungszeiten, leichtere Herstellung. Bislang gelang es Acorn ihren Prozessordesign bereits in der 1. Silizium-Fassung lauffähig herzustellen; eine lange Reihe von Champagneflaschen in der Empfangshalle zeugt von diesen Erfolgen. Allgemeiner Aufbau eines ARM Prozessors Der Prozessor hat, gemäß RISC-Konzept eine Load/Store Architektur, ein Instruktionssatz fester Instruktionslänge (32 Bit) mit Conditional Execution, und eine dreistufige Pipeline. Damit die Pipeline durch Sprungbefehle nicht so häufig geleert werden muß, hat man das Konzept der Conditional Execution sich ausgedacht. Alle Instruktionen sind mit Bedingungen kombiniert. So kann man einige Branches sparen, und die Pipeline effektiver einsetzen. Der ARM besitzt 16 universelle (von denen eine die Rolle des Program Counters hat) 32Bit Register, die zu allen Zeitpunkten sichtbar sind. Mit Augenmerk auf eine rasche Interrupt-Abarbeitung weisen ARM Prozessoren sogar mehrere Duplikate auf. In (Fast)Interrupt- und SupervisorMode überblenden diese dann die entsprechenden UserMode-Register. Dadurch erspart man sich, im Falle eines Interrupts das umständliche Retten von Register, was ja mit teueren Speicherzugriffen verbunden ist. Die ersten Modelle ARM1, ARM2 und ARM3 hatten außerdem eine Besonderheit, die wohl aus Sparsamkeit entstanden war. Der Adreßraum dieser CPUs war nur 26Bit lang, sodaß der 16. Register R15 neben den PC auch Platz für das PSW hatte. Da alle Adressen word-aligned waren, verwendete man zudem die untersten zwei Bits des PCs als den ProzessorModus. Diese eigenwillige Verwendung von R15 wurde später aufgegeben. "Dafür" haben spätere Modelle einige schöne Extras, u.a. On-chip Cache, Verlängerung des Pipelines, noch mehr ProzessorModi, Thumb Extension. Aber später mehr dazu. Aus ARM wird ARM Leider kam Acorn mit seinen Prozessoren und Homecomputern etwas spät auf dem Markt: Gegen 1985 war die Nachfrage an Homecomputern sehr stark zurückgegangen, da der Markt gesättig war. Dabei hatte Acorn erst 1987 seinen ersten ARM-gesteuerten Homecomputer, den Archimedes fertiggestellt. Während sich Acorn weiter auf Personal Computer konzentrierte, untersuchte VLSI neue Einsatzbereiche für die ARM Prozessoren und rührte dabei kräftig den Werbetrommel. Es stellte sich heraus, daß viele Firmen an den Einsatz von ARM als embedded Controller sehr interessiert waren. Gerade die neue Entwickling hin zu Portables und Handhelds richtete die Augen der Hardwarehersteller auf ARM und RISC allgemein, wegen deren besonderen stromsparenden Eigenschaften zusammen mit hoher Performance. Insbesondere zeigte Apple großes Interesse an ARMs Produktpalette. 64 Seminar Moderne Prozessorarchitekturen ARMs im Überblick Zur Verbesserung der Akzeptanz der Prozessorreihe ARM bei anderen Computerherstellern, hatte man sich bei Acorn dazu entschlossen, die ARM-Division auszugliedern. Unter Beteiligung von VLSI und Apple entstand aus dieser die ARM ltd. Man mache sich klar, daß ARM nicht mehr für Acorn RISC Machine steht, sondern für Advanced RISC Machine. ARM ltd. führte gleich Veränderungen in der ARM Architektur durch, um seine Produkte attraktiver zu gestalten für potentiellen Lizenznehmer: Die ARM Prozessoren wurden um zwei dedizierte Register, CPSW und SPSW und Prozessor Mode-Register erweitert, infolge dessen der 26 bittige Adreßraum der Vergangenheit angehört. Ein paar Modelle bieten aber noch eine 26Bit Emulationsmodus an, womit alte "26Bit"-Software noch verwendet werden können. Auch lassen sich die ARMs nun wahlweise als big- und little-endian betreiben. Eine neue Nomenklatur der (neuen) CPUs wird eingeführt, zur schnelleren Identifikation der CPUs als Prozessorkern (einstellige -), Prozessor (zweistellige -) und Makrozelle (dreistellige Modellnr). Zur Verdeutlichung des Wandels zu ARM ltd. soll der nächte ARM Prozessor ARM6 heißen. Die mittlerweile große Bibliothek an Schaltkreisen, I/O Bausteinen rundum ARM-CPUs wurde den Lizenznehmer, neben mächtigen Entwicklungstools und Debuggingtools zur Verfügung gestellt. Dank des Baukastenkonzeption wird die Entwicklung von Chips und Makrozellen beschleunigt. Aus eigener Erfahrung wußte Acorn nur allzu gut, daß eine möglichst kurze Entwicklungszeit bei Herstellung von Custom-CPUs von essentieller Bedeutung war. ARM ltd. lebt von den Lizenzen an ihren ARMs, der Vielzahl an mächtigen Entwicklungstools, die sie ihren Kunden zur Verfügung stellt. Auch begleitet sie ihren Kunden bei der Entwicklungsprozeß von Custom-Chips. Neben der ARM-Reihe sind noch der, in Zusammenarbeit mit Digital entwickelte StrongARM und das Forschungsobjekt Amulet im Rahmen asynchroner Prozessoren an der Manchester Universität wichtig, da diese noch Innovationen gegenüber ARM bieten. Daher werde ich kurz auf die drei Prozessorreihen eingehen. Die ARMs sind gegliedert nach Modellnummer und nach Architektur (oder Instruction Set Architecture). Neben den typischen Hardware-Spezifika der Prozessoren, wie Taktfrequenz, Cache, Pipeline spielt die Architektur eine übergeordnete Rolle, denn an ihr kann man erkennen, welche Prozessoren kompatibel sind. ARMs im Überblick ARM Architektur v1 ARM1 ARM Architektur v2 ARM2 ARM3 ARM Architektur v3 ARM6, ARM7, Amulet ARM Architektur v4 ARM8, ARM9, StrongARM ARM Architekur v5 & VFP v1 ARM10 & VFP10 Seminar Moderne Prozessorarchitekturen 65 ARM & relatives Thumb extension die Wiederanwendung des RISCprinzips auf ARMs RISCprozessor ? Das Thumb ISA ist eine Erweiterung des bestehenden ARM ISA, kann auch als eigenständiger 16bittige Instruktionssatz verstanden werden. Wieso Thumb? Man hat immer bei RISC-basierten Systemen kritisiert, daß diese recht speicherhungrig sind. Für performante und große Rechnersysteme dürfte dieses Argument kein Hindernis sein, aber für Handhelds, Portables und Ähnliches wird die Frage nach benötigten Ressourcen nahezu zur Grethenfrage. Man halte sich vor Augen, wie wichtig die optimale Ressourcenplanung ist, was eine starke Ressourcenknappheit zur Folge hat. Aus Erfahrung ist bekannt, daß durch Code-Optimierungen per Hand ca. 10 bis 20% Platz eingespart werden kann, wobei dies recht zeit- und arbeitsintensiv ist. Verbesserungen am Compiler erreichen einen noch geringeren Platzersparnis. Der Einsatz von komprimierten Code kostet Performance für die Dekomprimierung, und stellt somit evtl. auch keine akzeptable Lösung dar. Zwar hat ARM ISA im Vergleich zu anderen Instruktionssätzen anderer RISC Prozessoren eine recht hohe Code-Dichte, dennoch hat sich das ARM-Team bemüht, Ihre Prozessoren in diesem Disziplin noch besser zu gestalten. Das Ergebnis, Thumb ISA, kann sich sehen lassen und hatte zudem ein noch weiterer Vorteil im Petto! Alle Thumbinstruktionen sind 16 Bit lang, halb so lang wie ARM Instruktionen. Damit diese Instruktionen vom unveränderten Prozessorkern, der nur 32-bittige ARM Instruktionen versteht, wird ein Decompressor-Unit zwischengeschaltet. Dieser Dekompressor wandelt 16-bittige ThumbCode in 32-bittige ARMCode um, und das ohne Performance-Einbußen! Bei dem Design des Thumb Instruktionssatzes wurde eine Untermenge des ARM Inktruktionssatzes gewählt, bestehend aus den wichtigsten Instruktionen des ARM Instruktionssatzes, angereichert mit einigen zusätzliche Instruktionen, die das Leben eines ThumbProgrammierers erleichtern. Bei der Kodierung dieser in 16-Bit Wörter ging man ebensfalls sorgfältig vor, sodaß eine möglichst kostengünstige Konvertierung begünstigt wird. Da nun 16 Bit statt 32 Bit zur Verfügung stehen, sind gewisse Einschränkungen unumgänglich, beide Wichtigen wären das Wegfallen des Conditional Bits und somit der Feature Conditional Execution und des direkten Zugriffs auf die obere Hälfte der Register. 66 Seminar Moderne Prozessorarchitekturen ARM10 Thumb Das aktuelle ARM Modell 1020T mit Vector FPU Trotz des Verlustes der Condition Execution ist Thumb-Code ist ca. 30-40% kürzer als ARM-Code. Aber die Sahne auf den Törtchen ist der mögliche Einsatz von 32-Bit ARM Prozessoren (um somit potentielle 32Bit Performance) in einer 16-Bit Umgebung. Oder denkbar wäre auch der Einsatz von 16-Bit Komponenten in einem Thumb-System, womit den Designern ein neues Kostensparungspotential angeboten wird, auch wenn das Performance-Einbuß mit sich brächte. Dadurch, daß sich der Prozessor entweder im Thumb- oder ARM-Modus (Bit in PSW) befindet, läßt sich Thumb- und ARM-Code mischen. Umschaltung zwischen beiden Modi erfolgt mittels Branch and eXchange Befehl, also wird dabei auch die Pipeline geleert. Fazit: Ein neues Konzept mit vielen Vorteilen und geringen Nachteilen. Mit rel. wenig Einsatz können ARM Prozessoren eine Thumb-Erweiterung erfahren. Somit hat sich am Design der ARMs auch wenig verändern müssen. ARM10 Thumb Das aktuelle ARM Modell 1020T mit Vector FPU Mit dem ARM9 gelang es ARM nicht wirklich den StrongARM wesentlich zu übertreffen. Daher war man gespannt auf die offizielle Ankündigung des ARM10. Im Oktober 1998 war’s soweit: und man wurde nicht enttäuscht: Fabriziert in 0,25und 0,18= µm liefert er 400 MIPS bei 300 MHz mit (nahezu sicher) ca. 0,6 mWatt. Der optionale Vektor Floating Point Unit bringt es auf 600 MFLOPS. Die ARM1020T Macrozelle basiert auf den ARM10TDMI Integer Core und VFP10 FPU mit Caches und MMU, wobei die internen Datenpfade des 32Bit Kerns zu den Caches und zum Coprozessor sind 64Bit breit sind. Bloß auf Super-skalarität hat man verzichtet. Sie hat eine set-assoziativ arbeitende, Hardvard Cache Architektur mit jeweils 32 kB, einer MMU und einem TLB. Das Betriebsystem kann bei der Ersetzungsstrategie wählen zwischen RoundRobin und fully-random. Der Instruktionscache und TLB bieten ein Feature namens lock-down: Bereiche des Caches können gezielt dort verbleiben. Dem Datencache wurde ein kleiner Write Buffer mit 8 Einträgen spendiert, damit der Kern ohne Wartezyklen weiterrechnen kann. Auch bei Cache Miss wird die Pipeline nicht angehalten, das Datum kann "nachgereicht" werden. Damit würde sich dieser Prozessor auch für RealTimeBetriebsysteme und RT-Applikationen eignen. Seminar Moderne Prozessorarchitekturen 67 ARM & relatives Der ARM10TDMI Kern hat fünf pipelines: 1. Fetch (Instruction Fetch & Branch Prediction) 2. Instruction Decode & Register Read 3. Execute (Shift & ALU), Adress calculate und Multiply 4. Memory Access / Multiply und 5. Register Write Wie man auf der obigen Abbildung erkennen kann, fällt auf, daß einige Units der Execution Stufe mit dem Decode und Memory Access & Multiply Stufe überlappen. Auch können mehrere Instruktionen in gleicher Stufe verarbeitet werden, soweit sie von einander unabhängig sind. Die Branch Prediction Einheit profitiert von den 64Bit Anbindung an den Cache und kann Sprünge vorm Fetch erkennen, die Zieladresse auswerten und Instruction Fetch an der Zieladresse veranlassen. Es wird spekuliert, daß Zieladressen vorm PC Schleifen sind, und genommen werden. Im Schnitt liegt man bei dieser statischen Annahme zu 80% richtig. Now for something completely different: VFP10, ein FPU nach Vector Floating Point Architecture (VFP v1) besitzt einen Satz Register, die je nach gewünschten Genauigkeit entweder 16 double precision Werte , und 32 single precision Werte aufnimmt. Entweder werden einzelne Vektoren abgelegt, und diese im SIMD Verfahren mit einer Operation verarbeitet. Alternativ kann der Satz so genutzt werden, daß 8 Skalare mit, entweder 6 vier-elementige oder 3 acht-elementige Vektoren Platz haben. Die FPU besitzt zwei Pipelines, die nicht völlig getrennt sind; sie teilen sich die ersten beiden Stufen Fetch und Decode. Bedingt durch das Vektorkonzept des VFPs stellt dies aber keine Beeinträchtigung der Parallelität beider Pipelines. Die fünf-stufige Load/Store Pipeline überträgt pro Zyklus ein double oder zwei single precision Werte in den / aus dem Speicher. Die sieben-stufige arithmetische Pipeline ist eine multiple-add Pipeline, in der elementare Operationen "direkt", komplexere, wie Division, Wurzelfunktion oder Modulo als iterative Prozesse ausgeführt werden. StrongARM-Reihe Digital´s ARM-Implementation StrongARM (1996) ist ein Gemeinschaftsprojekt von Digital und ARM, wobei Digital hier sein jahrenlange Expertise in Chipdesign mit einbrachte und einige Erneuerungen und weitere Ideen zur Verringerung der Stromaufnahme einführte. StrongARM liefert 230 MIPS bei 200 MHz. Intel übernahm die StrongARM-Reihe von Digital, pflegt sie weiter und vermarktet sie heute. 68 Seminar Moderne Prozessorarchitekturen AMULET Forschung asynchroner Prozessoren auf Baszs von ARMs Das erste Modell SA-110 (Ende 96) der StrongARM Reihe, basiert auf den ARM6, hatte aber weitreichende Verbesserungen: • 32Bit x 32Bit => 64Bit + Akkumulator Instruktion • Byte-, Halfword- und Word-Datentyp (neue Instruktionen) • eine fünfstufige Pipeline • Cache on chip in Harvard Cachearchitektur: Instruction Cache und Data Cache jeweils 16KByte • interne PLL clock: Erzeugung hoher Freq. aus niederfreq. Quarz, der wenig Strom verbraucht • Einführung Stromsparmodi neben Normalbetrieb: Idle- und Sleepmode • Write buffer mit 8 Einträgen • kein Branch History Table Somit klassifiziert sich dieser Prozessor als ARM v4 und visiert den PDA-Markt an, für den er aufgrund seiner geringen Stromaufnahme bei guter Leistung prädestiniert ist. Digital stellte ARMs Prozessor ARM8 ziemlich in den Schatten, sodaß dieser von der Welt wenig Abachtung erfuhr (sogar ARM verschweigt nahezu den Existenz ihres Stück Silizium auf der ARM Website!). Leider hatte der StrongARM einen Nachteil: er war nicht komplett ARM v3 konform; dank der Harvard Architektur und der fünfstufigen Pipeline gab es keine hundertprozentige Binärkompatibilität mit Prozessoren der ARM v3 Architektur. Beide sind ein Novum für die ARM-Welt, in der ja meist um jedes Byte gerungen wird. Daher wird man vor unsauberen Programmiermethoden wie selbstmodifizierendem Code nicht zurückschrecken. Die genauen Problemstellen:- Bislang wiesen gängige ARM Prozessoren eine dreistufige Pipeline auf, mit der Programmierer dann gerechnet haben. Leider bringt die Verlängerung des Pipelines ein paar Veränderungen mit, z.B. ist der gesicherte PC bei Stack calls nicht zwei 32Bit Wörter, sonder vier 32Bit Wörter dem aktuellen PC voraus ist. - Selbstmodifizierender Code und eine Harvard Cache-Architektur harmonisieren besonders gut, wie man sich leicht vorstellen kann. Man reicht einen Chip namens 21285 nach, der dem SA-110 als I/O Interface zu gängigen Komponenten fungiert. 21285 bietet u.a. eine SDRAM-, FlashROM-, PCI-Bus Schnittstelle an. Die Modelle SA-1100 bzw. 1110 mit Companionchip SA-1101 resp. SA-1111 sind nahezu identsch (PCMCIA - und Speicher Controller unterschiedlich) und werden daher zusammen besprochen: Sie sind Nachfolger des SA-110 mit integrienten I/O Schnittstellen, wie USB end point controller, LCD Controller, UART, IrDA, PCMCIA AMULET Forschung asynchroner Prozessoren auf Baszs von ARMs Amulet1 (1990-1993) Asynchrone Schaltkreise werden schon länger erforscht, aber Steve Furber implementierte mit seiner Forschungsgruppe an der Manchester University den ARM6 in asynchroner Logik, das Ergebnis heißt Amulet1. Hergestellt unter nahezu gleichen Bedingungen, erreicht das Amulet1 ca. 70% eines 20 MHz getakten ARM6. Das eigentliche Ziel wurde leider nicht errreicht: man wollte zeigen, daß ein asynchroner Prozessor weniger Strom verbraucht, als sein synchroner Pendant. Amulet1 verbrauchte nämlich genau so viel wie der ARM6. Man muß dabei aber bedenken, daß ARM6 schon ein revidiertes Design hatte, wogegen Amulet1 in der ersten Fassung vorlag. Seminar Moderne Prozessorarchitekturen 69 ARM & relatives Amulet2 (1996) Eine Weiterentwicklung des Amulet1, der weniger Strom verbraucht, vier 1kB Cache-Bloecke hat und um kleinere Tweaks wie Branch Prediction ergänzt wurde. Die Leistung bewegt sich zwischen ARM7 und ARM8 Amulet3 Dieser asynchroner Prozessor baut auf den ARM7 Core mit Thumb Extensions. Erwartet werden über 100 MIPS. Quellenverzeichnis Homepage der Firma ARM http://www.arm.com The history of the ARM chip http://www.ant.co.uk/~carol/armchap1.html StrongARM bei Intel© http://support.intel.com/support/processors/strong/ ARM chips list http://www.geocities.com/~banksp/Archives/ARMChips.html Amulet development http://www.cs.man.ac.uk/amulet/index.html 70 Seminar Moderne Prozessorarchitekturen