Grundlagen zu Intels Itanium (Teil I)

... und Spekulieren

Neben dem Vorabladen von Daten kann der Itanium auch Sprüngen vorangestellte Ladeoperationen und Berechnungen spekulativ durchführen (Control Speculation). Beim Befehl ld.s (Load Speculative) versucht die CPU, Daten in ein Register zu laden. Das betreffende Register wird markiert, falls beim Laden ein Fehler oder eine Ausnahme aufgetreten sind. Eine solche Ausnahme kann zum Beispiel eine "Page not Present Exception" sein, falls das Betriebssystem die betreffende Seite noch nicht im Speicher eingeblendet hat.

Zur Markierung besitzen die Allzweckregister r0...r127 ein 65. Bit, welches Intel als Not a Thing (NaT) bezeichnet und das bei ungültigen Registerwerten gesetzt ist. Bei Fließkommaregistern wird dagegen ein Wert als Kennzeichnung verwendet, der als Fließkommazahl nicht definiert ist (Not a Value, NatVal).

Im weiteren Programmablauf rechnet man ungeniert mit den Registern und kümmert sich nicht darum, ob sie überhaupt einen sinnvollen Wert enthalten. Erst später prüft man mit dem Befehl chk.s (Check Speculation), ob das Ergebnis auf gültigen Daten beruhte. Ist beim Ergebnis einer Berechnung das NaT-Bit gesetzt oder enthält das Fließkommaregister den Wert NatVal, so führt man über den chk.s-Befehl einen Sprung auf eine Programmsequenz aus, die die Berechnung mit gültigen Daten erneut durchführt.

Im Beispiel rechts wird r3 spekulativ geladen und mit dem Inhalt von r5 nach r6 addiert. Falls die nachfolgende Bedingung durchlaufen wird und man das Ergebnis der Summe benötigt, prüft die CPU zunächst mit chk.s r6, recv, ob r6 einen gültigen Inhalt besitzt. War die Spekulation nicht erfolgreich, wird die Berechnung durch einen Sprung zu recv nachgeholt. Nach Abarbeitung des Korrekturcodes springt der Programmablauf wieder zum Befehl nach chk.s zurück.

Sinnvoll ist obiges Beispiel vor allem dann, wenn man die Summe in r6 nur innerhalb eines Zweiges der Bedingung benötigt. Hat man Glück, steht sie bereit, und der Itanium hat sie "nebenbei" schon im Vorfeld berechnet. Falls nicht, muss man eben noch einmal explizit die Berechnung starten. Und läuft man überhaupt nicht in die Bedingung, kann einem das Ergebnis sowieso egal sein.

Die Verwendung der spekulativen Ausführung von Ladebefehlen führt zwar meist zu einem schnelleren Programmablauf, bedeutet jedoch auch einen größeren Programmcode, da der Korrekturcode ebenfalls vorhanden sein muss. Zudem "verheizt" der Itanium Zeit und Energie mit der Bearbeitung von Befehlen, die eventuell auf ungültigen Daten beruhen.

In diesem ersten Teil des Artikels wurden die speziellen Fähigkeiten des Itaniums, sein Registersatz und die Besonderheiten des EPIC-Befehlssatzes behandelt. Der zweite Teil beschreibt die Pipeline und Cache-Stufen im Detail und geht auf die Kompatibilität und die Performance ein. (ala)