SIMD und VLIW

Heute wieder ein Thema aus dem Bereich Computer. Ich habe meinen Artikel über SIMD und VLIW aktualisiert (in dem noch mehr drin steht, für alle die der Blog nicht reicht). Fangen wir mit der Begriffsdefinition an:

  • SIMD steht für Single Instruction, Multiple Data
  • VLIW steht für Very Long Instruction Word

Fangen wir mit SIMD an. Eine klassische Assembleranweisung eines Prozessors bearbeitet einen oder zwei Werte die in einem Register stehen. Bei SIMD sind es mehr als maximal zwei Werte, die entweder in Registern stehen, die viele Werte fassen oder in überlangen Registern, in denen einzelne Teilbereiche jeweils für einzelne Werte stehen. Es gibt dann noch SISD (Single Instruction Single Data, das sind entspricht den meisten Prozessorbefehlen eines x86-Prozessors und MIMD (Multiple Instruction, Multiple Data), das liegt bei einem Mehrkernprozessor oder einem Rechner mit mehreren CPUs vor.

Das Paradebeispiel für die erste Architektur ist der Vektorrechner, so die Rechner von Seymour Cray, das zweite ist die Umsetzung in der x86 Architektur die SSE oder AVX heißt. Die Rechner von Cray hatten Register die 64 Werte fassten. AVX hat derzeit 256 Bit breite Register (ab nächstem Jahr 512 Bit), die maximal acht einfach genaue oder vier doppelt genaue Zahlen fassen.

Das wichtigste ist: Mit einem Befehl wird nun die Berechnung vieler Werte „angestoßen“. Bei der Cray gab es drei funktionelle Einheiten für diese Operationen, in die pro Takt eine Zahl reingesteckt wurde und Nach einer gewissen Latenz ein Ergebnis pro Takt herauspurzelte. Man konnte sie miteinander verketten und so die relativ häufige Kombination von Multiplikation gefolgt von einer Addition beschleunigen. Während eine Cray für eine einfache Berechnung (eines Wertes) 7-10 Takte brauchte, fiel diese Zeitdauer bei den SIMD Anweisungen nur für die erste Rechnung an, die folgenden brauchten nur einen Takt bzw. Bei Kombination mehrerer Rechenwerke waren sogar zwei Operationen pro Takt möglich.

Intel nutzt mehrere Rechenwerke, die jeweils einen Teilbereich des überbreiten Registers als Eingang und Ausgang nutzen und so parallel arbeiten. Beschleunigt werden die Operationen auch durch den unten angesprochenen Burstzugriff – das Laden von 4 Zahlen auf einen Rutsch geht schneller als das einzelne Laden von einer Zahl.

SIMD nutzt vor allem dann etwas, wenn in einer Schleife in einem Feld immer dieselben Anweisungen durchlaufen werden, dann kann man n Schleifendurchläufe durch eine einzelne SIMD Instruktion ersetzen die N Werte verarbeitet.

Intel verweist immer dann, wenn es um die Performance ihrer Prozessoren geht, auf die Steigerungen durch SIMD Anweisungen die bei Intel in den Befehlserweiterungen AVX und SSE stecken. Damit lenken sie den Blick davon weg, dass bei Nichtnutzung der Befehle die Anwender bei dem Kauf eines neuen Prozessors seit einigen Jahren nur noch eine leichte Beschleunigung ihrer Software wahrnehmen. Kann man die Software optimieren, wie dies bei Supercomputern, wo Zehntausende dieser Prozessoren abreiten und die Rechner zweistellige Millionenbeträge kosten, dann lohnen sich SIMD Anweisungen, zumal die dortigen Probleme auch sehr gut für SIMD Anweisungen geeignet sind. Bei  dem was der Benutzer mit seinem PC tut, ist dies eher nicht der Fall. Der früher von Intel als Hauptzweck angeführte Einsatz für die Beschleunigung von Multimediainhalten wird heute von den GPU besser erledigt. Selbst eine im Prozessor integrierte GPU wie die Intel HD 4X00 Grafik ist da effizienter als die AVX Anweisungen des Prozessors.

VLIW hat einen anderen Ansatz:

Heute haben die meisten Prozessoren mehr als eine ALU oder FPU, können also mehr als einen Ganzzahlen- und einen Fleißkommabefehl pro Takt durchführen. Doch folgen diese im Befehlsstrom linear aufeinander. Will man vermeiden dass der größte Teil des Prozessors Däumchen dreht muss man zwei Dinge tun:

  • Befehle vorziehen und an eine gerade freie Einheit übergeben
  • Feststellen ob es keine Wechselwirkungen gibt.

Das letztere ist nicht ganz einfach. Es gibt hier sehr viele Wechselwirkungen. So können sich Befehle bei der Ausführung überholen und ein späterer Befehl kann das Ergebnis eines früheren Befehles überschreiben. Es kann Abhängigkeiten geben, das man das Ergebnis einer Rechnung als Ausgangswert für eine zweite braucht oder ein Ladevorgang kann ein Ergebnis überschrieben bevor es genutzt wird. Das Umsortieren der Befehle Fachwort „Out of Order Execution“ ist heute Standard, macht aber auch sehr komplexe Chips nötig. Intel hat dieses Feature bei der ersten Atom-Generation eingespart – Der Atom hatte mit 42 Millionen Trasnsistorfunktionen nur ein Zehntel der Elemente eines iCore Prozessors, aber er war auch entsprechend langsam

Beim Itanium Prozessor ging man mit VLIW einen anderen Weg. In einem Befehlsbündel, dem VLIW wurden mehrere Befehle so gruppiert, das sie möglichst parallel durchgeführt werden. Einige Statusbits informieren über die Abhängigkeiten. Die eigentlich geniale Idee dahinter: der Compiler, der den Quelltext hat und daher die Abhängigkeiten viel besser kennt, soll den Code so erzeugen das möglichst viel parallel abgearbeitet werden kann. Doch das klappte nicht so wie gewünscht. Das war ein Grund für den fehlenden kommerziellen Erfolg des Itaniums.

Das ist eine Form von VLIW, es gibt weitere, so kann man Befehle die zusammenhängen, z.B. in einer Schleife ausgeführt werden bündeln. Man kann auch VLIW mit SIMD kombinieren, wie dies bei der Verarbeitung von Signalen der Fall ist.

Es gibt für SIMD wie auch VLIW Architekturen einen zweiten wichtigen Grund, der liegt in der Funktionsweise von DDR Speicher. Nach einer Latenz, die von der Langsamkeit des Speichers abhängt und viele Taktzyklen des 200 MHz Basistaktes beträgt, liefert der Speicher das erste Datenwort aus, danach bei jeder Taktflanke ein weiteres Wort, insgesamt achtmal. Er greift dazu parallel auf verschiedene Bänke zu, sodass die langsame Zugriffszeit als Latenz nur beim ersten Zugriff erfolgt. der Prozessor muss dann acht mal 64 Bit entgegennehmen. Bei DDR-3 Speicher und einem mit 3,2 GHZ getakteten Prozessor der Nehalem Architektur braucht man für die 64 übertragenen Byte 109 Takte, davon entfallen 45 für den ersten Zugriff und die Wartezeit nach dem letzten Zugriff bis ein neuer erfolgen darf und 64 Takte auf den Transfer.

Würde man die Befehlsworte immer 64 Byte breit machen, so kann man pro Transfer eines transferieren das dann mehrere elementare Befehle enthält. Mehr noch: das nächste steht direkt dahinter, das erleichtert das vorrauschschauende Lesen und erhöht die Systemgeschwindigkeit weiter, denn normalerweise sind Befehlsworte unterschiedlich lang, in der X86 Architektur zwischen einem und 17 Bytes. Intern kann dann ein 64 Byte Wort, das mehrere Befehle enthält parallel dekodiert werden, also gleichzeitig mehrere Befehle ausgeführt und an die Funktionseinheiten verteilt werden.

Trotzdem ist VLIW noch nicht so verbreitet in der Hardware, was vielleicht auch daran liegt das einige VLIW Architekturen ihr Performanceversprechen nicht einlösen konnten, so z. B. der I860 Prozessor der VLIW einsetzte.

So, nun noch ein Rätsel: Welcher Rechner setzte VLIW und SIND ein? Mir persönlich fällt spontan einer ein, aber sicher gibt es mehrere richtige Antworten)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.