Grundlagen zu Intels Itanium (Teil II)

17.02.2004 von ALBERT  LAUCHNER und Christian Wiegand
Im zweiten Teil unserer Itanium-Grundlagen betrachten wir die Kompatibilität zu anderen Prozessoren, Details der Pipeline und der Cache-Stufen sowie die Rechenleistung von Intels Prozessor für die richtig 'dicken' Server.

Wie im ersten Teil unserer Itanium-Grundlagen zu lesen, ist die 64-Bit-CPU ein gemeinsames Projekt der Firmen HP und Intel. Deshalb sollte die Itanium-Architektur sowohl kompatibel zur PA-RISC-Architektur von HP als auch zur IA-32 von Intel sein. HP entwickelte deshalb ein Verfahren namens Dynamic Translation, das die Binärkompatibilität des Itanium zur PA-RISC-Familie und zum Betriebssystem HP-UX sicherstellen soll.

Dabei werden die RISC-Maschinenbefehle der PA-Architektur in die entsprechenden Befehle des Itanium übersetzt und zur Laufzeit eines Programms dynamische Optimierungen vorgenommen. Dies bedeutet, dass die Dynamic Translation bereits übersetzten Code im Speicher hält, falls er in Schleifen wiederholt durchlaufen wird, oder dass sie Vorteile der IA-64 wie Predication oder Spekulationen nutzt.

Die IA-32-Kompatibilität erreicht Intel durch eine Hardware-Emulation auf dem Prozessorchip. Die IA-32-Funktionseinheit simuliert dabei einen Pentium III mitsamt PC-Bausteinen wie den Timer oder die A20-Gate-Schaltung. Die Hardware setzt den IA-32-Befehlsstrom direkt in Itanium-Befehle um und leitet diese an die Ausführungseinheiten weiter, die IA-32-Register bildet sie auf Itanium-Register ab.

IA-32-EL: Schneller durch Emulation

So ersetzt die IA-32-Funktionseinheit die ersten beiden Stufen der Pipeline-Verarbeitung. Aus einem Itanium-Programmcode heraus kann jederzeit mit dem Befehl br.ia auf den IA-32-Befehlssatz umgeschaltet werden. Der IA-32-Befehl jmpe wiederum aktiviert erneut den Itanium-Befehlssatz. Interrupts des IA-32 verarbeitet der Itanium jedoch immer im Itanium-Befehlssatz. Von einer solchen Ausnahmebehandlung kehrt der Befehl rfi direkt zum IA-32-Code zurück.

Allerdings konnte die IA-32-Emulation in Hardware nie richtig überzeugen, da die Rechenleistung für echte Server-Software nicht ausreichte. Nützlich ist sie aber, wenn man IA-32-Administrationsprogramme zur Konfiguration und Wartung des Itanium-Servers nutzen will. Seit dem Servicepack 1 bietet Windows Server 2003 alternativ einen IA-32 Execution Layer IA-32 EL) in Software, der analog zu HPs Dynamic Translation arbeitet und deutlich mehr Leistung bietet als die Hardware-Emulation.

Schnell wie ein Xeon

Mit dem IA-32 Execution Layer soll einen 1,5-GHz-Itanium mit 6 MByte Cache immerhin die Leistung eines Xeon MP mit 1,5 GHz erreichen. Zudem ermöglicht die Software-Emulation ein einfaches Upgrade auf moderne virtuelle IA-32-CPUs mit Features wie SSE2 und SSE3.

Für dezidierte 32-Bit-Server-Anwendungen ist aber auch der IA-32 EL nicht wirklich geeignet. Ein Xeon-Server dürfte bei gleicher Leistung doch ein paar Euro billiger kommen. Interessant ist der IA-32 EL aber für Workstations mit dem Deerfield-Itanium. Typischerweise wird zwar deren Primäranwendung, wie etwa ein CAD-Programm oder eine Floatingpoint-orientierte Software als Itanium-Archtecture-Code vorliegen. Doch ein Workstation-Benutzer verwendet meist auch Programme wie eine Office-Suite, einen E-Mail-Client oder gar Active-X-Komponenten für den Internet Explorer. Spätestens da ist Schluss mit nativem 64-Bit-Code und zwingend eine schnelle IA-32-Emulation erforderlich.

Der Itanium 2

Der Itanium-2-Prozessor verarbeitet die Befehle in einer 8-stufigen Pipeline. Die beiden ersten Stufen IPG (Instruction Pointer Generation and Fetch) und ROT (Instruction Rotation) bilden das Frontend der Pipeline, die übrigen Stufen stellen das Backend dar. Die beiden Abschnitte der Pipeline sind durch einen Puffer entkoppelt, so dass sich Störungen im Ablauf oder Verzögerungen beim Laden nicht auf alle Pipeline-Stufen auswirken.

Jeder Befehl durchläuft alle Stufen, so dass eine Abarbeitung in Phasen aufgeteilt ist, die mit den Stufen korrespondieren. Die gesamte Pipeline bietet eine In-Order-Ausführung von Instruktionen, wobei pro Taktschritt bis zu sechs Befehle gleichzeitig zur Verarbeitung zugeteilt werden. Da Intel auf eine Out-of-Order-Ausführung verzichtet und die optimale Parallelisierung dem Compiler überlässt, ist die Hardware selbst relativ einfach und damit schnell. Den gewonnenen Platz auf dem Die nutzt Intel für ein umfangreiches System zum effizienten Speicherzugriff mit geringen Latenzzeiten.

Speicher und Caches

Der Itanium-Prozessor besitzt eine dreistufige Hierarchie von Caches. Die L2-und L3-Caches speichern dabei sowohl Daten als auch Instruktionen Unified Cache), der L1-Cache ist geteilt in einen L1-Instruktions-und einen L1-Integer-Cache. Der L2- und der L3-Cache können über das System-Interface direkt auf den Hauptspeicher zugreifen, die L1-Caches sind mit dem L2-Cache verbunden.

Die L1- und L2-Caches sind als so genannte Prevalidated-Tag-Caches ausgeführt, um L1-Cache-Zugriffe mit nur einem Zyklus Latenzzeit zu gewährleisten. Im Tag-Ram des Cache ist nicht die physikalische Speicheradresse, sondern eine Referenz auf einen Eintrag im Translation Lookaside Buffer (TLB) gespeichert. Beim Auslesen gibt der Cache die Daten aus den verschiedenen Wegen des mehrfach assoziativen Speichers parallel aus. Gleichzeitig wird aus der virtuellen Speicheradresse über den vollassoziativen TLB ein Vektor erzeugt, der genau einen 1-Bit- und ansonsten nur 0-Werte enthält (one hot vector).

Dieser Vektor wird parallel mit allen vom Mehrwege-Tag-Ram gelieferten Tags durch bitweise and/or-Operationen verglichen und, falls vorhanden, der Cache-Weg, der das gewünschte Datum speichert, ermittelt. Ebenfalls gleichzeitig mit diesem Vorgang werden gespeicherte Datenwerte des Mehrwege-Cache parallel ausgelesen und die Daten des ermittelten Cache-Weges schließlich an die nachfolgenden Funktionseinheiten weitergeleitet.

Der wesentliche Unterschied zu herkömmlichen Caches besteht somit darin, dass das Tag-Ram nicht die physikalischen Speicheradressen, sondern eine Referenz auf einen TLB-Eintrag speichert.

System-Interface

Das System-Interface des Prozessors ist mit 200 MHz getaktet und kann pro Takt zwei Speicherzugriffe vornehmen. Der Datenbus selbst hat eine Breite von 128 Bit. Damit kann der Itanium 2 bis zu 6,4 GByte pro Sekunde übertragen, mehr als das Dreifache des ersten Itaniums (Merced).

Die Speicherzugriffe führt der Itanium über 2 Queues aus: Die In-Order-Queue (IOQ) mit acht und die Out-of-Order-Queue (OOQ) mit 18 Einträgen. Die IOQ arbeitet die Speicheranfragen nacheinander ab, die OOQ enthält lediglich die aufgeschobenen Speicheranfragen in der Queue. Zusätzlich enthält das System Interface zwei 128-Byte-Pufferspeicher (coalescing buffer) für 8-Bit-Zugriffe auf den Speicher. Hier werden diese Speicheranfragen gesammelt und als gemeinsamer Speicherzugriff behandelt.

Details zur Pipeline: Frontend

Die Funktionseinheiten zur Erzeugung der Befehlsadresse (Instruction Pointer, IP), zum Laden der Befehle sowie die Funktionseinheit zur Emulation von IA-32-Befehlen bilden gemeinsam die ersten beiden Stufen der Prozessor-Pipeline. Diese beiden Stufen heißen Frontend der Pipeline.

Die Instruction Pointer Generation (IPG) Stufe holt die Instruktionen paarweise (zwei Bündel a drei Instruktionen) aus dem Speicher in den Prozessor und stellt sie den nachfolgenden Stufen zur Verfügung. Dazu wird als neue Befehlsadresse entweder der IP um 32 erhöht oder die Befehlsadresse einer Sprungvorhersage beziehungsweise die alternative Adresse bei fehlgeschlagenen Sprungvorhersagen ausgewählt. Die Sprungvorhersage der IPG-Stufe berücksichtigt dabei die Ergebnisse der letzten vier Befehlsausführungen eines jeden Sprunges im Instruktions-Cache. Ist die ermittelte Adresse bereits im L1-Instruktions-Cache gespeichert, werden die beiden zugehörigen Instruktionsbündel an die zweite Stufe der Pipeline übergeben. Andernfalls holt sie der Instruction Streaming Buffer aus den übergeordneten Cache-Hierarchien, speichert sie im L1-Instruktions-Cache und leitet sie direkt an die zweite Stufe weiter.

Ebenfalls in dieser Pipeline-Stufe ist die Prefetch Engine des Itanium zum vorausschauenden Laden von Instruktionen angesiedelt. Dazu wertet diese Funktionseinheit die Hints aus, die der Compiler optional an den Prozessor übergeben kann. Dieser lädt daraufhin maximal vier zusätzliche Cache-Zeilen des L2-Cache in den Instruktionsspeicher.

Die zweite Stufe der Pipeline heißt Instruction Rotation (ROT). Sie speichert im Instruction Buffer die zwei Bündel, die die erste Pipeline-Stufe übergibt. Je nach aktueller Auslastung der Ausführungseinheiten im Backend leitet die ROT-Stufe dann das neue oder das älteste Instruktionsbündel weiter. Da der Instruction Buffer acht Paare von Instruktionsbündeln zwischenspeichern kann, entkoppelt er den L1-Instruktions-Cache und den Befehls-Fetch von den restlichen Stufen der Pipeline-Verarbeitung.

Details zur Pipeline: Backend I

Das Backend der Pipeline verteilt die Instruktionen auf die verfügbaren Funktionseinheiten, verwaltet die physikalischen und logischen Register, führt die Instruktionen aus und schreibt die Ergebnisse in die Register. Damit legt das Backend den architekturellen Zustand der CPU fest.

Das Backend besteht aus den folgenden Pipeline-Stufen:

Die Pipeline-Stufe EXP verteilt jeweils ein Paar von Instruktionsbündeln (sechs Instruktionen) über elf so genannte Issue Ports auf die Funktionseinheiten. Ist für eine Instruktion des Bündels keine passende Funktionseinheit frei, warten alle Befehle einen Taktzyklus, bevor EXP sie gemeinsam verteilt. Die Verteilung auf die verschiedenen Funktionseinheiten erfolgt dynamisch. Sind etwa alle Integer-Einheiten belegt, kann EXP eine Integer-Operation auch einer Speicherfunktionseinheit zuweisen, die ebenfalls eine einfache Integer-Arithmetik beherrscht.

Die folgende Pipeline-Stufe REN besteht aus der Register Stack Engine (RSE) und dem Register Renamer. Die RSE lagert gegebenenfalls Registerinhalte in den Cache-Speicher aus, schreibt die Inhalte wieder zurück in die Register und stellt so verschiedenen Applikationen oder Unterprogrammen einen vollständigen Registersatz und lokale Register zur Verfügung. Zum Speichern oder Zurückschreiben von Registerinhalten kann RSE die gesamte Pipeline anhalten.

Die Register-Renamer-Funktionseinheit rotiert auch die Register bei Software-Pipelines. Spezielle Sprungbefehle im Code steuern die REN und lösen eine Rotation der Register aus. Diese Einheit benennt diese Register allerdings statisch und unabhängig von eventuellen Datenabhängigkeiten (Write after Read Hazard, WAR) um. Die passende Zuordnung wieder herzustellen, ist bei der EPIC-Philosophie die Aufgabe des Compilers. Damit fällt der Schaltungsaufwand für die REN wesentlich einfacher aus als für die Renaming-Einheit in Prozessoren mit Out-of-Order-Programmausführung.

Details zur Pipeline: Backend II

Die REG-Stufe der Itanium-Pipeline liest die Registerinhalte aus und stellt sie den Ausführungseinheiten zur Verfügung. Neben den vorhandenen Registerwerten reicht die fünfte Stufe auch die Ergebnisse vorangegangener Berechnungen an die Ausführungseinheiten weiter, die noch nicht in die Register zurückgeschrieben sind (forwarding). Damit kann die Ausführung von abhängigen Befehlen schon beginnen, bevor die vorangegangenen Befehle durch die Write-Back-Stufe komplett abgeschlossen wurden. Registerzugriffe registriert der Itanium im Scoreboard-Speicher. Falls Datenabhängigkeiten auftreten, wird die Ausführung weiterer Befehle gestoppt, bis die betreffenden Register wieder verfügbar sind.

Die eigentliche Berechnung oder die Ausführung sonstiger Befehle findet in der EXE-Stufe der Pipeline statt. Jede Integer- und logische Operation benötigt einen Taktzyklus zur Ausführung, Speicherzugriffe erfordern mindestens zwei und Fließkommaberechnungen vier Taktzyklen. Die so genannte Dependency-Matrix stellt dabei die Abhängigkeiten nachfolgender Operationen fest und verzögert die folgenden Befehle für die Dauer der aktuellen Berechnung. Die REG-EXE-Funktionseinheit besitzt zwölf Ports zum Lesen und acht Ports zum Schreiben in die Register, so dass Zugriffe weit gehend parallel erfolgen können. Die DET-Stufe kontrolliert den Fluss der Befehle in der Pipeline und stoppt bei Bedarf das Verteilen weiterer Instruktionen in der EXP-Stufe. Diese Ereignisse führen zu einem vorübergehenden Anhalten der Befehlsverarbeitung durch der DET-Stufe:

Die DET-Stufe erlaubt es den Caches, Speicheroperationen in den Befehlsfluss einzufügen, ohne die Programmausführung mehr als nötig zu verzögern. In der abschließenden WRB-Phase werden die Ergebnisse der Berechnungen in die Register zurückgeschrieben und damit vom physikalischen in den architekturellen Zustand der CPU übernommen.

Leistungsvergleich, SPEC

Obwohl alle Itanium-Prozessoren durch ihre Fließkommaleistung beeindrucken konnten, war die Integer-Leistung, die besonders im Server-Bereich benötigt wird, anfangs nicht die beste. Wie die Tabelle der SPEC-Ergebnisse zeigt, kann sich der Itanium der dritten Generation im Bereich der Fließkommarechnung deutlich von allen Konkurrenten absetzen. Bei 1500 MHz und mit einem L3-Cache von 6 MByte behauptet er sich jetzt auch bei den Integer-Berechnungen unter den Prozessoren vergleichbarer Taktfrequenz und liegt nun nahezu gleichauf mit dem Opteron von AMD.

Leistungsvergleich, TPC

Die für Server wohl wichtigsten Kennwerte werden vom Transaction Processing Performance Council (TPC) geliefert. Dessen Benchmarks messen die Leistung von Server-Systemen bei Datenbanktransaktionen.

TPC-C Benchmarks, 4-Way

CPU

tpmC

Kosten/tpmC (US-Dollar)

Stand 1/2004

Alpha 21264 1250 MHz

56375

9,44

AMD Opteron 844 1800MHz

82226

2,72

Itanium 2 1500MHz

136111

3,97

Xeon MP 2,8 GHz

90272

3,94

Unter den 4-CPU-Systemen erreicht ein auf dem Itanium 1,5-GHz-Prozessor basierendes System den höchsten Kennwert. Neben der Leistung der 4-CPU-Systeme halten Itanium-2-Rechner auch die höchsten bisher erreichten tpmC-Werte des TPC-C-Benchmarks: Ein HP-Superdome-System mit 64 Prozessoren vom Typ Itanium 2/1,5GHz lieferte den Spitzenwert von 1.008.144 tpmC bei den ungeclusterten Systemen. Als Cluster bietet ein HP Integrity rx5670 aus ebenfalls 64 Itanium-2-CPUs gar 1.184.893 tpmC.

Auffallend ist, dass die meisten der Top-Benchmark-Werte auf Rechnersystemen von HP erzielt wurden, die die hauseigenen Chipsätze zx1 und sx1000 verwenden. Diese scheinen die Leistung der Itanium-Prozessoren bislang am besten umzusetzen.

Fazit

Mit dem EPIC-Paradigma verlagert Intel einen großen Teil der Aufgabe, Programmcode zu parallelisieren, von der Hardware auf den Compiler. Dies bietet zum einen den Vorteil einer weniger komplexen und damit schnellen Hardware. Zum anderen ist diese Technologie in der Lage, die Ergebnisse zukünftiger Entwicklungen und Algorithmen zu nutzen, ohne dass Intel die Hardware ändern muss.

Durch das Konzept der Hints, des spekulativen Ladens von Daten und auch des Software-Pipelining wird ein Interface zum Compiler geschaffen, das ein effizientes Hardware-Software-Codedesign ermöglicht. Die vereinfachte Hardware zur Programmausführung erlaubt es, ein komplexes und schnelleres Speichersystem im Prozessor zu integrieren und so den Systemdurchsatz zu erhöhen. Mit der IA-64 definiert Intel eine Architektur, die viele Schwächen der alten IA-32 vermeidet. Insbesondere die Fließkommaeinheit des Itanium-Prozessors ist allen anderen Prozessoren dieser Klasse weit voraus.

Der Nachteil dieser Vorgehensweise liegt im teils wesentlich erhöhten Speicherbedarf für Programme. Da Befehle auf glatten 8-Byte-Adressen liegen sollten und nicht alle Kombinationen von Templates parallel ausführbar sind, enthält der Code viele NOP-Befehle. Der Korrekturcode für die spekulative Ausführung bläht die Programme zusätzlich auf. Predicated Instructions und das spekulative Laden von Daten beschäftigen die CPU zudem oft mit Berechnungen, die später wieder verworfen werden.

Nicht umsonst schluckt der Itanium 2 bei 1,5 GHz 130 Watt, der Strom sparende Deerfield immerhin noch 62 Watt bei 1 GHz. Wenngleich der Itanium-Prozessor daher kaum in tragbaren Computern zu finden sein wird, ist er dank seiner sehr leistungsfähigen Fließkommaeinheit und der innovativen Konzepte wie der Register-Rotation bestens für die Zukunft gerüstet. Nach einem zähen Start lehrt er im Server-Bereich inzwischen andere CPU-Hersteller das Fürchten. Und mit dem Deerfield schiebt Intel bereits vorsichtig einen Brückenkopf in Richtung Desktop-PC. (ala)