CPU-Grundlagen: VLIW-Architekturen & Intels Itanium

Compilerstrategien

Die praktisch erreichbare Performance einer VLIW-Architektur hängt wesentlich von der Parallelisierungsstrategie des Compilers ab. Schon für eine superskalare CPU muss der Compiler viel Arbeit investieren, um die Parallelisierbarkeit des Programms zu erhöhen. Ein VLIW-Compiler muss die Befehle zudem noch sortieren und zusammenfassen.

Dafür kommt häufig der Percolation Scheduling Algorithmus nach A. Nicolau (1985) zum Einsatz. Nach einer sorgfältigen Analyse optimiert der Compiler den Programmcode mit den von superskalaren Prozessoren bekannten Methoden wie dem Ersatz der Branch-Befehle durch die bedingte Ausführung von Befehlen und dem Loop Unrolling.

Anschließend parallelisiert er den Code und setzt die langen Befehlswörter zusammen. Hierzu wählt er einen parallelen Flussgraphen, dessen Knoten die gleichzeitig in einem Taktzyklus ausführbaren Operationen enthält und dessen (gerichtete) Kanten den Steuerfluss im Programm anzeigen.

Dafür existieren im Wesentlichen drei Kerntransformationen:

  • move-op zum Verschieben von Operationen zum Vorgänger hin

  • move-cj zum Verschieben von Verzweigungen zum Vorgänger hin

  • delete zum Löschen von inzwischen leeren Knoten

Der Compiler muss die Kerntransformationen entsprechend wählen, um ein Optimum an Performance zu erreichen. Die passende Strategie kann sich dabei sogar von Applikation zu Applikation unterscheiden.