Grundlagen zu Intels Itanium (Teil I)

Rotation mit dynamischen Registern

Die dynamischen Register bieten gegenüber der IA-32 zahlreiche Besonderheiten. Zum einen kann die Register Stack Engine (RSE) den Inhalt der 96 so genannten stacked/rotating Register bei Bedarf in den Cache-Speicher auslagern. Dadurch können Unterprogramme dieselben Register verwenden wie die aufrufenden Routinen und bis zu 127 lokale Integer-Variablen in den schnellen Registern halten. Die langwierigen push- und pop-Befehlssequenzen, die bei IA-32 nötig sind, um Register in Unterprogrammen erst einmal frei zu räumen, vermeidet die IA-64 so durch eine entsprechende Prozessor-Hardware.

Zum anderen bieten die 96 dynamischen Allzweckregister (und ebenso die 96 dynamischen Floatingpoint-Register) auch eine so genannte Rotation. Zunächst ordnet der Itanium dabei den physikalischen Registern virtuelle zu. Diese Zuordnung wird dann typischerweise in den Iterationen einer Schleife pro Durchlauf jeweils um eine Position verschoben. Ist beispielsweise das virtuelle Register v33 auf das physikalische Register r52 abgebildet, so enthält es in der nächsten Iteration den Inhalt von Register r53 - ohne dass die CPU dafür zeitaufwendig Daten physikalisch kopieren muss.

Beispiele für Schleifenstrukturen, die sich durch diese Rotation optimieren lassen, sind Filterfunktionen für die Bildbearbeitung. Hier wertet man für jeden Bildpunkt die benachbarten Bildpunkte aus und berechnet daraus den Farbwert des neuen Punkts. Typischerweise läuft eine Schleife dafür über alle Bildpunkte, die Berechnungen sind unabhängig voneinander. Beim ersten Bildpunkt bringt Rotating noch keine Vorteile: Die Schleife lädt alle benötigten alten Bildwerte in die virtuellen und die entsprechend zugeordneten physikalischen Register und berechnet den ersten neuen Bildpunkt. Beim zweiten Bildpunkt zeigt sich der Vorteil: Rotating verschiebt alle virtuellen Registerinhalte um eine Position, ohne dafür Rechenleistung zu verbrauchen. Jetzt muss die CPU nur noch einen der ursprünglichen Farbwerte neu einlesen und findet alle anderen bereits in den passenden virtuellen Registern vor.

Besonders effizient wird dies, wenn man auch das so genannte Software-Pipe- lining mit berücksichtigt. Da ein superskalarer Prozessor wie der Itanium 2 sechs Befehle gleichzeitig ausführen kann, laufen mehrere Iterationen einer Schleife gleichzeitig ab. Besteht wie im obigen Fall keine Abhängigkeit der Ausgangsdaten, greifen die Iterationen über dieselben virtuellen Register auf unterschiedliche physikalische Register zu, wodurch sich ein zeitaufwendiges Kopieren der Daten von Register zu Register vermeiden lässt.