CPU-Grundlagen: VLIW-Architekturen & Intels Itanium

VLIW-Zusammenfassung

Die VLIW-Architekturen zeichnen sich im Wesentlichen dadurch aus, dass der Compiler die Parallelität der Befehlsausführung bereits zur Übersetzungszeit festlegt. Eine superskalare CPU hingegen führt die Parallelisierung zur Laufzeit aus.

Performance-Gewinne um Größenordnungen sind hierdurch kaum vorstellbar. Die Analyse des Objektcodes kann zwar wesentlich detaillierter und vor allem in einem größeren Kontext erfolgen. Prinzipiell gibt es jedoch keine Unterschiede zwischen superskalarer CPU mit dynamischem Scheduling und VLIW-Architektur mit der Möglichkeit zum statischen Scheduling durch den Compiler.

Der wesentliche Vorteil einer VLIW- gegenüber einer superskalaren Architektur besteht darin, dass ein komplexer Teil der Hardware wegfallen kann. Das Data Forwarding innerhalb der VLIW-CPU muss aber in jedem Fall erhalten bleiben: Ein Fortfall ergäbe zwar drastische Einsparungen in der Hardware, da das Data Forwarding bis zum vierfachen Platz einer ALU einnehmen kann. Die Einschränkungen für den Compiler wären allerdings sehr drastisch, da er alle Datenabhängigkeiten über viele Takte beachten müsste.

Die tatsächlich einzusparende Hardware betrifft vor allem das Register Renaming, das Instruction Dispatching und das Instruction Issueing. Diese Einheiten können ganz oder in weiten Teilen entfallen, da der VLIW-Compiler deren Arbeit übernimmt.

Der wesentliche Nachteil von VLIW-Programmen liegt in ihrer Codegröße: Der zentrale Ansatz der VLIW-Architekturen besteht ja darin, einen großen Block mit mehreren Instruktionen als eine atomare Einheit im Code anzusehen. Kann der Compiler nicht alle Felder darin mit unabhängigen Instruktionen füllen, besetzt er die freien Stellen mit NOP-Befehlen. Diese blähen VLIW-Programme stark auf.

Abhilfe hierfür schafft eine Kodierung, die keine feste Befehlslänge und keine festgelegten Plätze für bestimmte Instruktionsgruppen nutzt. Diese so genannte Configurable-Long-Instruction-Word-Architektur (CLIW) markiert das jeweilige Ende des Codes durch ein ansonsten nicht genutztes Bitmuster.