Home Computer Prozessor Basics Site Map counter

SIMD und VLIW

Einführung

Schon immer war man bestrebt, die Geschwindigkeit eines Rechners zu erhöhen, dazu gibt es viele Ansätze, wie RISC oder CISC, oder paralleles Rechnen. Andere Ansätze setzen am Speicher an, wie Caches oder synchrone RAMs. In diesem Aufsatz geht es um Änderungen des Mikrocodes, der eine höhere Verarbeitungsgeschwindigkeit erlauben sollte.

Das Problem

Nie ist ein Prozessor schnell genug. Vor allem aber ändern sich die Ansprüche an einen Prozessor. Nehmen wir als Beispiel die Entwicklung der IA86 (Industrie Architecture 86), also des Intel 8086 Prozessors und seiner Nachfolger. Als der 8086 im Jahre 1978 erschien, war er als Prozessor für PCs und Workstations gedacht. Er kostete 360 Dollar und sein Einsatz in der Unterhaltungselektronik, verbot sich schon alleine vom Preis. Das Prozessoren für PC und Workstations einige Hundert bis Tausend € kosten, daran hat sich bis heute nichts geändert.

Heute gibt es nicht nur viele Geräte die es damals nicht gab, und die Mikroprozessoren beinhalten, wie DVD Spieler/Recorder, MP3 Spieler, PDA, Handys, sondern auch im PC haben sich die Anforderungen verändert. Für Textverarbeitung und Tabellenkalkulation reicht heute ein ausgedienter Pentium PC. Die größten Anforderungen stellen heute Videoschnitt und 3D Spiele.

Diese verarbeiten aber andere Daten - nicht einzelne Bytes, sondern ganze Datenblöcke und damit war es notwendig die Architektur der Prozessoren zu ändern. Das führte zur Einführung von SIMD (Single Imnstruction, Multiple Data), beginnend mit dem Pentium MMX.

Der Vorgänger: Der Vektorrechner

CRAY 1 SupercomputerWie bei jeder Neuerung in der PC Welt, gab es Vorläufer in der Großrechnerwelt. Ende der sechziger Jahren etablierte sich eine neue Rechnergattung die man bald "Supercomputer" nannte. Es waren Rechner gebaut um sehr schnell Rechenoperationen durchzuführen. Damit waren sie für die Wirtschaft (anfangs) relativ uninteressant, bei der es vor allem um das Verarbeiten von Daten ging. Die Klientel von Supercomputern waren zuerst Militär und Wissenschaft, die vor allem Simulationen auf diesen Rechnern laufen ließen.

Führende Firma war damals CDC (Control Data Corporation.) und der Kopf hinter den Rechnern war der Ingenieur Seymour Cray. Als er sich Anfang der siebziger Jahre selbstständig machte, dachte er daran, wie er die Geschwindigkeit der Rechner vergrößern konnte. Was ihm auffiel, war das beschränkte Spektrum der Anwendungen auf seinen Computern. Obgleich es sehr viele Probleme gab, die man mit den Rechnern untersuchte, war bei vielen die Vorgehensweise gleich:

  1. Unterteile das Problem in viele kleine Zellen
  2. Formuliere einen Satz Berechnungen für jede Zelle
  3. Berechne die Ausgangsgrößen für jede Zelle
  4. Wiederhole Schritt 3 mit den Ergebnissen als neue Ausgangsgröße bis zum Endzustand

So ging man bei der Wettervorhersage vor (Unterteilung der Erde und der Luft über ihr, in ein dreidimensionales Netz aus Luftzellen, Berechnung des Wetters für jede Zelle für die nächsten 10 Minuten und Wiederholung des ganzen mehrmals) wie auch bei Auto Crash Simulationen (Unterteilung eines Autos in kleine Zellen, Berechnung der Kräfte die auf jede Zelle einwirken für eine Tausendstel Sekunde und Wiederholung) wie auch bei anderen Simulationen wie die Explosion einer Supernova oder die Ausbreitung von Schallwellen bei der Erdölsuche. Neben diesem "Differenzverfahren" bezeichneten Rechenverfahren gibt es auch andere Methoden aber auch sie sind hochgradig parallelisierbar, das bedeutet die elementaren Teile der Rechenvorschrift durchlaufen immer dieselben Berechnungen. Das ist auch so bei dem Teilchen-Prinzip (Verwendet bei Atom- und Molekülmodellen, aber auch der Simulation von Himmelskörpern) und den finitiven Elementen (bei der Wechselwirkung von Oberflächen wie in Crashs oder der Aerodynamik von Flugzeugen).

Wenn man also in jeder Zelle dieselben Berechnungen macht, warum sollte man diese nicht effizienter gestalten? Das führte zum Prinzip des Vektorrechners, so genannt, weil eine Reihe von Zahlen auch Vektor genannt wurde.

Die Cray 1, die 1976 erschien, war der erste Computer nach diesem Prinzip. Die Rechenwerke waren so aufgebaut, dass sie auch Daten einzelnen verarbeiten konnten, aber auch eine ganze Reihe von Zahlen hintereinander verarbeiten konnten. Diese standen dann als lange Schlangen hinter dem Befehl. Der Vorteil war dass man nur die Rechenoperation für alle Daten definieren musste. Man musste den Befehl nicht × mal holen und dekodieren. Denn nachdem man den Befehl für die erste Operation hatte, konnte man die folgenden Daten schon mal in die Register laden. Am deutlichsten war dies bei einer Multiplikation, die normalerweise 10 Takte dauerte. Dies galt aber nur für die erste Multiplikation, die folgenden dauernden nur 1 Takt. So, dass 30 Multiplikationen 39 Takte dauerten (10 + 29 * 1) anstatt 300. (10 × 30)

Die Cray 1 berechnete also in einem Befehl die Daten vieler Zellen, auf die immer dieselbe Berechnung angewandt wurde. Erreicht wurde dies mit 8 Vektorregistern, die jeweils 64 Datenworte auf einmal aufnehmen und bearbeiten konnten. Wie im Reißverschlussprinzip wurde pro Takt um ein Datenwort weitergeschaltet und ein Ergebnis purzelte aus der Recheneinheit. Andere Vektorrechner verarbeiteten bis zu 1024 Elemente auf einmal.

Vektorrechnern waren sehr lange Zeit sehr erfolgreich, doch setzten sich ab Anfang der neunziger Jahre, die Rechner auf der Basis vieler PC Prozessoren durch. Diese brauchten keine spezielle Hardware und waren so einfacher zu produzieren.

SIMD

SIMD steht für Single Instruction, Multiple Data. Wie de Begriff andeutet, sollen mit einem Befehl mehrere Datenworte bearbeitet werden, SIMD ist eigentlich die Aufgabe von Signalprozessoren. Dies ist spezialisierte Hardware für das Verarbeiten von gleichartigen Datenströmen. Praktische Anwendungen sind z.B. das Kodieren oder Dekodieren von MP3 und MPEG Datenströmen. Das verarbeiten der Daten von Handys, oder das Überziehen einer 3D Szene mit einer Textur.

Bei Digitalen Signalprozessoren (DSP) folgen einem Befehl daher ganze Datenblöcke, die dann in sehr breite oder sehr viele Register geladen werden und alle gleich bearbeitet werden. Auch hier muss man den Befehl nur einmal aus dem Speicher holen und dekodieren. Das spart Zeit, ebenso wie während der Durchführung einer Operation auf einem Register schon mal das folgende Register mit den Daten gefüllt werden kann. SIMD ähnelt daher einer Pipeline, in die hinten Daten reinkommen und vorne synchron Rechenergebnisse herauspurzeln.

Als diese Einsatzgebiete Mitte der neunziger Jahre immer wichtiger wurden, dachte man bei allen Prozessorherstellern nach, ob dies nicht ein Verkaufsargument für eigene neue Prozessoren wäre. Man begann nach Lösungen zu suchen, wie man SIMD einsetzen kann, ohne den Prozessor umzukrempeln. Ein sehr gutes Beispiel ist hier die Entwicklung bei der Intel IA86 Linie:

Da ein Vektorrechner mit einer Instruktion bis zu 64 Werte berechnet kann er auch als SIMD Architektur angesehen werden, nur gab es den Begriff damals noch nicht. Von einem Vektorrechner unterscheiden sich die SIMD Implementierungen in der IA86 Architektur in der Art wie Ergebnisse verarbeitet werden. Die IA86 Architektur hat dazu besonders breite Register die mehrere Zahlen aufnehmen. Diese werden dann in einem Rutsch durch mehrere parallel arbeitende Rechenwerke verarbeitet. Es werden immer n Zahlen (n derzeit 4 oder 8) gleichzeitig verarbeitet, weil ein Register immer n Zahlen fasst. Die Vektorrechner haben dagegen Register die aus n Einzelregistern bestehen und die man separat mit Zahlen gefüllt werden und es ist angebbar wie viele Zahlen bearbeitet wrden und ab welchem Startregister dies startet.

Speicher

Ein Vorteil vom SIMD Instruktionen ist, das sie auch die heutige Speicherarchitektur abgestimmt ist. Dynamisches RAM, DRAM konnte Prinzip bedingt nicht in der Zugriffsgeschwindigkeit so gesteigert werden wie Prozessoren. Seit dem Jahr 2000 liegt die Zugriffszeit für im Handel verfügbares und bezahlbares DRAM bei 8 bis 12 ns. Der Kehrwert dieser Größe ist der Maximaltakt mit dem ein Prozessor auf das RAM zugreifen kann. Hat er einen höheren Takt, so muss er warten bis das RAM die Daten liefern kann. Bei den angegebenen 8 bis 12 ns sind dies 80 bis 125 MHz. Das ist heute sehr wenig. Prozessoren haben 2014 einen Takt von 2000 bis 4000 MHz.

Die Kompensation dieses Mankos erfolgt zum einen durch Caches in den Prozessoren. Eine zweite Lösung bestand in mehr Parallelität in den RAM-Bausteinen. DDR-RAM arbeitet nach folgendem Prinzip: Fordertt der Prozessor Daten an, so liefert dieser Speicher nicht nur die angeforderten Daten aus, sondern ohne dass der Prozessor dies initiert auch die Daten die auf den folgenden Adressen liegen. Dazu aktiviert der Speicherbaustein die Speicherstellen die auf die angeforderte Adresse folgen in einen Abstand von einem Takt. Da die Auslieferung dann parallel zu einem Basistakt (dem Frontside Bustakt) erfolgt muss dieses festgelegt und eingehalten werden. Der Vorgänger von DDR-RAM hieß daher auch SDRAM (Synchrones DRAM). DDR-RAM unterscheidet sich von SDRAM durch die Tatsache dass man pro Takt zweimal Daten transferiert.

DDR-RAM wird nach einer Vorlaufzeit jeweils 8 Bytes pro Takt liefern und dies achtmal wiederholen. Die Vorlaufzeit ist immer länger als die Zeit in der ein Datenwort (heute 64 Bit) über den Bus geschrieben wird. Daher arbeiten seit der Einführung von DDR-RAM die Speicherbusse mit einem Takt von 200 MHz.

Für SIMF Anweisungen ist diese Architektur vorteilehaft. Da sie in ein Register sehr viele Werte einlesen bzw. diese  Register sehr breit sind können sie von der hohen Bandbreite (viele übertragene Daten pro Sekunde) Nutzen ziehen. Der Nachteil von DRAM, sein langsamer Erstzugriff wirkt sich nicht so stark aus wie bei den Operationen mit vielen Registern mit einzelnen Werten die meistens auch  nicht hintereinander im Speicher angeordnet sind.

MMX Multimedia Extension

Pentium ProzessorDamit man überhaupt die großen Daten bearbeiten kann, braucht man breite Register oder mehr Register. Diese Änderung der Architektur scheute Intel und kam auf einen Trick. Die FPU (Recheneinheit für Fließkommazahlen) des Pentium Prozessors hat 80 Bit breite Register. Diese wurden nun zweckentfremdet. Anstatt hier jeweils eine Fließkommazahl unterzubringen konnte man nun jeweils acht 8 Bit oder vier 16 Bit Werte simultan bearbeiten. (Die restlichen 16 Bits wurden nicht benutzt, in ihnen steckte sonst die Mantisse). Die neuen Befehle bekamen die Bezeichnung MMX (Multimedia Extension) und die entsprechende Version des Pentiums bei dem diese erste SIMD-Erweiterung eingeführt wurde entsprechend Pentium MMX.

Dazu gesellten sich neue Befehle die keinen Überlauf haben. Damit ist folgendes gemeint: Addiert man die 8 Bit Werte 90H und 90H so wird das Resultat 120H sein. Da dies nicht in ein 8 Bit Register passt wird man dort den Wert 20H vorfinden. Das ist, wenn es sich um Helligkeiten handelt, (überlagern einer Textur einem Untergrund) schlecht, dann ist das Pixel nicht maximal hell, sondern dunkel. Bei einigen Befehlen gibt es daher eine Version mit Sättigungsmodus: Überschreitet das Resultat den Wertebereich von 8 bzw. 16 Bits, so ist der Registerinhalt danach der größte 8 bzw. 16 Bit Wert.

MMX war für einige Spezialanwendungen ganz interessant, aber noch nicht der große Wurf. Zu klein waren einfach die 8 Bit und 16 Bit Werte. Die meisten Spiele arbeiten z.B. mit 32 Bit Koordinatensystemen. Mit dem Pentium 4 hat man die möglichen Werte dann auch auf 32 Bit erweitert.

MMX beim Pentium war mehr eine Marketing Maßnahme, denn eine echte Erweiterung. Mit Ausnahme der Sättigung hätte man alle MMX Befehle auch mit den 32 Bit Registern simulieren können (dort allerdings auf 32 Bit beschränkt), zudem konnte man MMX und Fließkommaeinheit nicht gleichzeitig nutzen, so dass man zeitraubend zwischen beiden Modi umschalten musste. Einige Benchmarks beschleunigten um 10 Prozent, aber breit eingesetzt wurde MMX nie.

3D Now!

Athlon ProzessorDie nächste Runde läutete dann AMD ein, welche eine Erweiterung von MMX in den K6 Prozessoren implementierte. MMX war ein geschützter Begriff und damit konnte AMD nicht werben. obgleich ab dem K6 Prozessor auch die Prozessoren von AMD die Befehle von MMX verstanden. So ging man dazu MMX zu erweitern um ein eigenes Verkaufsargument zu haben. 3D Now! erweiterte den Befehlssatz um weitere 32 Befehle um mehr mit den 8 und 16 Bit Werten anfangen zu können, wie das Berechnen von Durchschnittswerten oder Quadratwurzeln. Vor allem aber erweiterte 3D Now! die Möglichkeiten auch auf 32 Bit Zahlen einzusetzen, und zwar 32 Bit Ganzzahlen und 32 Bit Fliesskommazahlen.

Damit wäre 3D NOW eine Bereicherung für Spiele gewesen. "Wäre" deswegen, weil die meisten Softwarehäuser wegen der geringen Verbreitung der AMD Prozessoren vor einer Anpassung der Software zurückschreckten. Intel setzt 3D NOW! nicht ein, während alle AMD Prozessoren ab dem K6 MMX verstehen.

SSE

Pentium III ProzessorIntel führte mit dem Pentium III SSE ein. SSE steht für Streaming SIMD Extension. Später, als es weitere SSE Versionen gab wurde daraus SSE 1. Anders als MMX hat man nun wirklich geklotzt und nicht gekleckert. 70 neue Befehle wurden eingeführt und nun benutzen die Befehle eigene, neue Register, anstatt die der FPU. Die neuen Register XMM0 bis XMM7 haben eine Breite von 128 Bit und können so bis zu vier 32 Bit Fließkommazahlen aufnehmen, die Rechenleistung steigt also gegenüber MMX erheblich an.

Die Befehle decken nun alle arithmetischen und logischen Verknüpfungen für 32 Bit Zahlen ab: Addition, Subtraktion, Multiplikation und Division. Wurzelziehen, Vergleichen, logische Verknüpfungen wie AND, OR und XOR. Damit kann man sowohl bei "Multimedia" Anwendungen etwas anfangen, wie auch "normale" Anwendungen so umschreiben , dass mehrere Werte parallel bearbeitet werden - sofern man sich mit nur 32 Bit Genauigkeit (7 Dezimalstellen) zufrieden gibt.

SSE ist wie 3D NOW patentrechtlich geschützt und dürfte in den Athlon Prozessoren von AMD nicht eingesetzt werden. Auch hier blockierte diese Einschränkung den Einsatz von SSE. Denn AMD hatte als SSE eingeführt wurde einen stabilen Marktanteil von 20-30 %. Genug Anwender um bei einem Softwarehaus, das SSE einsetzt, die Hotline Telefone glühen zu lassen.

SSE2

Pentium 4 ProzessorDie nächste Erweiterung des IA86 Befehlssatzes in Richtung SIMD ist SSE2, die Erweiterung von SSE des Pentium 4. Es gibt einige neue Befehle, doch das wichtigste ist die Erweiterung der Rechenoperationen auf 64 Bit breite Zahlen. 64 Bit Fliesskommazahlen sind das Standardformat bei wissenschaftlichen Berechnungen, aber auch im Finanzesektor, weil die Genauigkeit von 32 Bit Zahlen zu klein ist. (Würde man mit Geldbeträgen Arbeiten so gäbe es schon beim Rechnen von Summen mit mehr als 100.000 Euro Fehler im Centbereich).  Mit SSE2 erreicht der Pentium 4 bei einigen wissenschaftlichen Benchmarks auch beeindruckende Werte, z.B. beim Multiplizieren von Matrizen. SSE2 ist weniger eine Erweiterung für Multimediaanwendungen, weil man dort sich mit kleineren 32 Bit Daten begnügt, als viel mehr für wissenschaftliche Anwendungen. SSE2 war mit 144 neuen Befehlen die bisher umfangreichste Erweiterung des Befehlssatzes. Der Geschwindigkeitsgewinn beruht nicht nur auf der doppelten Fließkommaleistung gegenüber den "normalen" FPU Befehlen. (Theoretisch: 2 FLOPS/Takt), sondern auch dass das Laden der SSE-Register schneller geht als das Laden von von zwei Fließkommaregistern.

Durch ein Abkommen mit AMD versteht auch der Athlon XP Prozessor SSE2, während Intel dafür die 64 Bit Erweiterung des Athlon 64 Prozessors nutzen darf. Der Athlon XP/64 Prozessor ist damit der einzige, der alle SIMD Erweiterungen verarbeiten kann.

Weitere Erweiterungen der SSE Architektur folgten, bedingt durch eine Einigung über die Lizenzen (Intel wollte die x64 Architektur die AMD entwickelt hatte und AMD die SSE Befehle) war auch die Zeit der Alleingänge der beiden Prozessorhersteller zu Ende.

SSE3

Mit der Core Mikroarchitektur (und parallel bei der zweiten Generation des Pentium 4) wurde SSE3 eingeführt. SSE3 war nicht wie SSE2 eine sehr starke Erweiterung des Befehlssatzes, sondern mehr eine Abrundung um Befehle die man nicht immer braucht, aber die in Einzelsituationen recht nützlich sind. SSE3 hatte nur 12 neue Befehle. Sie erlaubte die komplexe Arithmetik, Umwandlungen von Ganzzahlen in Fließkommazahlen und umgekehrt. Dazu kamen weitere Befehle für die Synchronisation und Datenanforderungen für den Speicher. Die wesentliche programmmtechnische Änderung war, dass das Ergebnis auch aus den vier 32-Bit Einzelwerten eines Registers gebildet werden kann ("horizontale Programmierung")  anstatt aus den Kombinationen von zwei Werten aus unterschiedlichen Registern ("vertikale Programmierung"). Das war bei Intel neu, 3D-NOW arbeitete schon vorher mit diesem Prinzip.

SSE4

SSE4 wurde in zwei Schritten, SSE4.1 und SSE4.2. SSE 4.1 wurde mit der zweiten Generation der Core Microarchitectur (Codename "Penryn") eingeführt. SSE 4.1 umfasste 41 Befehle, mit denen man das Skalar Produkt berechnen, Maxima und Minima bestimmen, Integerwerte ineinander umwandeln und bedingt Werte in andere andere umwandeln kann. Diese Erweiterung kam wieder Multimediaanwendungen zugute, die die Ausgangsbasis für MMX und SSE waren, nachdem die beiden vorherigen Erweiterungen vor allem wichtig beim Einsatz im wissenschaftlichen Bereich waren.

In der nächsten Generation, "Nehalem" wurde dann der zweite Teil, SSE 4.2 nachgeschoben. SSE 4.2 hatte Befehle für den CRC32 Algorithmus, der Prüfsummen berechnet und Stringsuchbefehle die von Intel für das Parsen von XML empfohlen wurden. Allerdings waren letztere zwar erheblich schneller als die seit der 8086 Generation eingeführten Präfixe für Stringoperationen, aber sie waren auf die Breite der SSE-Register beschränkt, d.h. maximal 16 Zeichen von 8 Bit Größe (bei Unicode nur 8 Zeichen). Der praktische Nutzen war dadurch eher klein.

AMD erweiterte SSE3 durch vier eigene Befehle, die SSE4a heißen. erneut schlugen nun Streitigkeiten zwischen den Firmen zu, die zu verschiedenen Versionen führten. Danach einigte man sich und AMD führte seine SSE5 Erweiterung nicht mehr ein. Mit SSE4.2 endete die Serie von SSE, die nächsten Erweiterung hieß nun AVX.

AVX1

SSE wurde durch AVX (Advanced Vector Extensions) abgelöst, mit dem neuen Namen zogen auch zwei Neuerungen ein:

Die wichtigste war der Übergang auf das Dreioperandenformat. Das ist das was wir auch von der Mathematik kennen, z.B. in dieser Form:

Y = x + b

Dabei würde Y ein Register sein, die Werte von X und B würden auch in Registern stehen. SSE setzte sie die normalen Prozessorbefehle der x86 Architektur das Zweioperanden Format ein, dabei wird ein Register der beiden Operanden durch das Ergebnis überschrieben. Die Dreioperandenschreibweise ist nicht nur natürlicher, in vielen Berechnungen braucht man die Werte der Operanden noch in anderen folgenden Berechnungen. Bisher musste man diese nachdem sie durch das Ergebnis überschrieben wurden neu laden. Da man nun aber mehr Register braucht wurden die Registerzahl von 8 auf 16 erhöht und diese umbenannt von XMM auf YMM.

Als zweites wurden die Fließkommaregister "verbreitert" zuerst auf 256 Bit (AVX1). Die Registernamen XMM greift nach wie vor auf die unteren 128 Bits zu, so gibt es eine Komptabilität zu SSE.

AVX1 führte vor allem Befehle ein, mit denen man diese Register verwalten konnte bzw. zur Übernahme von SSE-Software die oberen 128 Bits löschen konnte.

AVX2

 2013 führte Intel AVX2 ein (Haswell-Architektur). Während AVX1 vor allem neue Befehle für das Füllen der Register oder Bewegungen von Teilen der Register einführte, kamen bei AVX2 neue Befehle hinzu. Dies war die Verarbeitung von 256 breiten Zahlen, Schiebe und Rotationsoperationen, vor allem aber die Einführung der FMA Anweisung (Fused Multiply Add). Schon die Cray 1 hatte fast drei Jahrzehnte vorher die Möglichkeit pro Takt eine Multiplikation und eine Addition durchzuführen. Diese führte diese durch Chaining durch: Werte wurden von einer Recheneinheit an die nächste Weitergeleitet und beide arbeiteten parallel. Die Kombination von Addition und Multiplikation wird sehr oft gebraucht in vielen wissenschaftlichen Problemen wie z.B. der Matrixmultiplikation.

AVX512

AVX512 ist von Intel für 2015 angekündigt. Wahrscheinlich wird beim Erscheinen dann ein neuer Name gewählt wie "AVX3". AV512 erweitert die Register auf 512 Bit. Damit ist es möglich bis zu acht Fließkommazahlen mit doppelter Genauigkeit (64 Bit Breite) mit einem Befehl zu verarbeiten. Die Register heißen nun ZMM wobei man mit XMM und YMM auf die unteren 256 bzw. 128 Bit zugreifen kann. AVX512 wird ohne neue Befehle die Geschwindigkeit deutlich erhöhen, theoretisch auf das doppelte.

AVX512 wird wieder neue Instruktionen einführen, so die Möglichkeit die 512 Bit breiten Register auch für 8,1,6,32 und 64 Bit Ganzzahloperationen zu benutzen (seit MMX lag der Schwerpunkt mehr auf der parallelem Verarbeitung von Fließkommazahlen) und ein besserer Support für das vorrausschauende Laden aber auch das entdecken von Konflikten um Schleifen noch besser zu Vektorisieren.

Was bringt es?

Es stellt sich nun die Frage, in wie weit man diese Erweiterungen in den Anwendungen wieder findet und wie weit diese beschleunigt werden. Die ernüchternde Antwort ist: Es gibt kaum Anwendungen die von SSE und AVX rapide beschleunigt werden. Das gilt zumindest für die "Wald und wiesen" Anwendungen die ein durchschnittlicher PC-Benutzer einsetzt.

Der schwarze Peter liegt an vielen Stellen. Zum einen an den Softwarehäusern selber, die sich nicht einen Teil des Marktes entgehen lassen wollen. Der Einsatz einer SIMD Erweiterung bedeutet entweder Ausschluss von Anwendern, die diese nicht nutzen können (und schlimmer noch: Erhöhte Kosten für die Hotline und den Ruf, denn die Anwender haben dann eine nicht funktionierende Anwendung!) oder Mehrarbeit, indem man Codeteile doppelt programmieren muss, einmal "normal" und einmal als SIMD.

Das zweite ist der Compiler. Auch die neuesten Compiler von unabhängigen Herstellern unterstützen die neuen Befehle kaum. Das Problem ist hier vor allem zu erkennen, das Parallelität vorliegt. Bei den Vektorrechnern gab es spezielle Compiler für diese Rechner, die den Sprachschatz so erweiterten, dass der Anwender sagen konnte was parallel abgearbeitet wird und der Compiler das effizient umsetzen konnte. Dies ist bei den heutigen Compilern nicht möglich. Ausnahme scheinen lediglich die Compiler zu sein, die direkt von den Prozessorherstellern Intel und AMD stammen. Ein Test der Zeitschrift ct bei verschiedenen Compilern, die Programme der SPEC Suite (Benchmark für wissenschaftliche Anwendungen) übersetzten, zeigte, dass die meisten keine oder nur wenige SIMD Befehle nutzten.

Der Programmierer muss mit der Erweiterung OpenMP parallelisierbare Teile der Anwendung kennzeichnen. Das ist der erste Schritt. Der zweite ist es den Compiler anzuweisen, auch die SSE oder AVX Anweisungen zu benutzen. OpenMP verteilt nur die Teile die parallel nutzbar sind auf verschiedene Kerne. Da wir immer die gleichen Berechnungen haben bringt OpenMP schon eine Beschleunigung bei den heute verfügbaren Mehrkernprozessoren, ohne AVX zu nutzen.

Ein Test von ct' bei einem triviale Beispiel, der Maxtrixmultiplikation. Es ist im Kern nur folgende Routine (hier in "C"):

#define DIM 1000
typedef double mat[DIM][DIM];

mat a, b, c;

void clear()

{
	for (int i = 0; i < DIM; i++)
		for (int j = 0; j < DIM; j++) {
			c[i][j] = 0.0;
			b[i][j] = i * 1.2;
			a[i][j] = j * 1.1;
		}
}

int _tmain(int argc, _TCHAR* argv[]) {
	clear();
	for (int k = 0; k < DIM; k++)
		for (int j = 0; j < DIM; j++)
			for (int i = 0; i < DIM; i++) {
				c[i][j] += a[i][k] * b[k][j];
			}

Die eigentliche Rechnung ist die Zeile:

c[i][j] += a[i][k] * b[k][j];

Dank der FMA Instruktion sollte ein Prozessor 2 FLOPS/Takt/Thread berechnen können. Mit C-Compilern von Microsoft kam man auf maximal 37 GFlops bei einem 2,8 GHz iCore i7 Prozessor (4 Kerne, 8 Thedas). Selbst bei Anweisung AVX zu nutzen und alle Kerne. (ohne diese lag die Performance bei 3,2 GFlops). Nur Intel erreichte mit SSE 4.2 11 GFlops bzw. mit AVX 20 GFLOPS (ohne Mehrkernsupport). Mit Nutzung einer Bibliotheksfunktion kam man auf 140 GFLOPS. Die theoretische Maximalleistung des Prozessors lag bei 179,2 GFLOP.

Neben der Ernüchterung, dass der Microsoft-Compiler, der sehr oft eingesetzt wird nur einen Bruchteil der Leistung erreicht, die Intel mit ihrem eigenen Compiler erreicht (der aber nicht so oft genutzt wird), muss man feststellen, das auch  Intel maximal 62 GFLOPS anstatt 140 erreichte, wenn man nicht auf die Bibliotheksfunktion zurückgriff. Nun gibt es aber nicht für jedes Problem, jede Codeziele eine Bibliotheksfunktion die dann optional vom Hersteller des Prozessor programmiert ist. Die Maxtrixmultiplikation ist so häufig, das es dafür eine gibt.

Es zeigte sich auch das es enorme Unterscheide gab, je nachdem

Diese Effekte waren viel stärker als der Gewinn durch die AVX Instruktionen. Bei schlechter Programmierung konnte die Geschwindigkeit auf 0,12 GFlops oder weniger als ein Tausendstel der Spitzengeschwindigkeit sinken.

Anders sieht es im wissenschaftlichen Bereich aus. Die naturwissenschaftlichen Modelle für viele dortige Berechnungen wurden schon vor Jahrzehnten entwickelt. Die grundsätzlichen Berechnungen finden in einem kleinen Kern statt Dieser kann optimiert werden und dann von vielen Simulationen genutzt werden oder auch nur das Modell mit unterschiedlichen Daten mehrmals durchlaufen werden können.

Früher hätte man das Dekodieren und Encodieren von Videos, sowie Bildbearbeitung als idealen Einsatzzweck für SSE und AVX anführen können. Bei Bildern werden alle Bildpunkte nach demselben Algorithmus bearbeitet. Doch das können heute viel effizienter die Grafikkartenhardware, selbst die einfachen Versionen die Intel und AMD heute in ihren Prozessoren integriert haben. Sie haben nicht die hohe Geschwindigkeit, doch eine Intel HD 4X00 Grafik hat mindestens 120 Shadereinheiten, jede kann eine Berechnung durchführen. Durch ihre große Zahl sind sie dann schneller als die 4 Kerne des Prozessors.

SIMD in Hardware

Es ist nun ein Trugschluss zu denken, dass SIMD unwichtig sei. Das Gegenteil ist der Fall. Es wird nur auf der PC Plattform nicht genutzt. Doch in den vielen Geräten der Unterhaltungselektronik sitzen Signalverarbeitungsprozessoren, die in der Regel alle SIMD Befehle haben und die auch effizient genutzt werden. Wie anders wären MP3 und DVD Player für 50 € möglich, einem Preis für den man nicht mal einen PC Prozessor bekommt? SIMD nutzt natürlich besonders bei geordneten Daten, wie dem gleichmäßigen Datenstrom einer CD oder den 8 × 8 Blöcken von Bildpunkten bei JPEG / MPEG. Doch auch das dekodieren der Daten, die beim Handytelefonieren anfallen, ist Signalverarbeitung,. Selbst im industriellen Alltag, wie den vielen Prozessoren, die in einem Auto Funktionen steuern, ist ein Großteil Signalverarbeitung. Bei fast allen diesen Anwendungen kann man SIMD Instruktionen effektiv einsetzen, da fast immer die Daten irgendwie transformiert werden müssen.

Signalverarbeitungsprozessoren haben dazu auch eine andere Hardware. Sie haben mehr Register um die Daten zu speichern und dann effizient gemeinsam zu verarbeiten. Bei den PC Prozessoren findet man dagegen meistens nur einige neue Register oder schon bestehende Register werden anders genutzt.

Wahrscheinlich arbeiten auch Grafikprozessoren mit SIMD. Vieles spricht dafür: Sie verarbeiten immer die gleichen Daten auf die gleiche Weise. Parallelität gibt es hier in Hardware. Im Jahre 2005 haben Grafikkarten bis zu 16 Shadereinheiten welche berechnen welche Pixels wie eingefärbt werden müssen. Sie hängen an bis zu 8 Pipelines an einem sehr breiten Datenbus von 256 Bit Breite an sehr schnellen RAM's - Im Prinzip ein Vektorrechner im Kleinformat. Dabei erreichen Grafikprozessoren bei 400-500 MHz Takt ein vielfaches der Leistung der eigentlichen CPU. Deutlich wird dies manchem Spieler, wenn auf einem Business PC ohne besondere Grafikbeschleunigung ein schneller Intel oder AMD Prozessor nur noch 10-15 Frames pro Sekunde darstellen kann während er es mit einer Spitzengrafikkarte auf 70-100 Frames pro Sekunde bringt.

Damit man mal einen Vergleich hat, die die Daten der im November 2006 jeweils leistungsfähigsten Prozessoren und Grafikprozessoren.

  Grafikprozessor Prozessor
Name G80 Intel Quad Core
Millionen Transistoren 681 731 Millionen
Taktfrequenz 1350/575 2930
Busbreite 384 Bit 64 Bit (extern, 128 Bit intern)
Transferrate 86.4 GB/s 8.5 GB/s
Einheiten 128 Shader, 64 Textureineheiten 4 Kerne, 7 Einheiten pro Kern
Cache keiner 8 MB

VLIW

Blockdiagramm ItaniumprozessorUrsprünglich verfügte jeder Mikroprozessor nur über eine Ausführungseinheit für Befehle. Wenn die Integrationsdichte ansteigt, kann man auf derselben Chipfläche mehr Transistoren unterbringen. Wie soll man dies nutzen? Nun es gibt viele Alternativen. So kann man den Cache auf den Prozessor verlagern oder Peripheriebausteine / RAM oder ROM bis hin zum "System on a Chip" (SOP). Die meisten Architekturen erhöhen jedoch die Anzahl der Ausführungseinheiten. Seit dem Pentium Prozessor gibt es z.B. auf der IA86 Architektur mehr als eine Ausführungseinheit für Ganzzahloperationen.

Damit diese auch voll ausgelastet sind, wird der Code analysiert und auf diese Einheiten verteilt. Das braucht viel Logik, vor allem wenn Verzweigungen im Code kommen wie bei Sprüngen in Unterprogramme oder Schleifen. Denn in diesem Fall ist die gesamte Vorarbeit hinfällig und man versucht diese daher voraus zu ahnen. Mehr über diese Technik, die man "superskalar" nennt in dem Artikel über paralleles Rechnen.

Digitale Signalprozessoren sind dagegen auf den Massenmarkt der Signalverarbeitung ausgerichtet. In diesem Segment zählt neben Leistung auch der Preis und diese komplexe Logik für die Verteilung der Befehle auf die Funktionseinheiten, das Vorrausahnen von Verzweigungen, braucht viele Transistoren und macht das Design teuer. Doch mehrere Ausführungseinheiten steigern die Geschwindigkeit, zumal Signalverarbeitung fast immer, dieselbe, gut parallelisierbare Aufgabe umfasst. So wird bei einer MPEG Dekodierung z.B. das Bild in 8x8 Pixel große Datenblöcke unterteilt, die man parallel verarbeiten kann.

Die Lösung bei VLIW ist es, den Compiler die Arbeit des Parallelisierens machen zu lassen. VLIW steht für very long instruction word und bezeichnet eine Vorgehensweise, bei der mehrere Befehle in ein gemeinsames Befehlsbündel gepackt werden. Der Compiler muss darauf achten, dass diese parallel abgearbeitet werden und wenn dies nicht der Fall ist, muss er das Befehlsbündel mit NOP Befehlen (No Operation: Mache nichts) auffüllen. Bei der leistungsfähigen TMS320C6xx Serie z.B. ist ein solches Befehlsbündel bis zu 256 Bits lang und umfasst 8 Instruktionen à 32 Bit Breite. VLIW hat ihre Wurzeln in den Achtzigern, als erste Implementierungen entstanden. (Bild oben: Aufbau des Itaniums, Bild unten der TMS320C62X Familie)

TMS320C62X KernDer Vorteil ist dabei, dass man weiß, dass diese Befehle parallel ausgeführt werden können. Das 256 Bit lange Bündel wird auf einmal geladen, die Befehle gleichzeitig dekodiert und an eine der 8 Recheneinheiten des Prozessors zugeführt. So erreicht der TMS320C620 Prozessor eine Leistung von 4800 MIPS bei nur 600 MHz Takt. Während zum gleichen Zeitpunkt (2001) ein aktueller Pentium III Prozessor bei 1130 MHz Takt nur 3390 MIPS erreichte. Der Prozessor verarbeitet also 2.3 mal mehr Daten pro Zeiteinheit. Theoretisch kann dieser Prozessor acht Instruktionen pro Takt verarbeiten.

Der Nachteil von VLIW ist, dass die hohe Leistung nur erreichbar ist, wenn man tatsächlich alle Positionen des Befehlsbündels mit Befehlen versorgen kann. Zudem braucht man immer 256 Bits für ein Befehlsbündel, auch wenn man nur 2 oder 3 Befehle darin unterbringen kann. VLIW ist also sehr speicherintensiv. Dies ist ein gravierender Nachteil. Bei den DSP verbindet man daher oft VLIW mit SIMD. So kann man die leeren Plätze z.B. mit Daten für eine SIMD Operation füllen. Bis heute findet man bei Signalverarbeitungsprozessoren häufiger VLIW Architekturen als in anderen Bereichen. Das liegt auch daran, das Signale besser parallelisierbar sind: Wenn man die Verarbeitung eines Messwerts nicht parallelisieren kann, so kann man dies in jedem Falle mit mehreren verschiedenen Meßwerten die sich dann in unterschiedlichen Stadien der Verarbeitung befinden. So arbeitet auch der SHRAC Signalverarbeitungsprozessor mit VLIW.

Oft sind die Prozessoren auch RISC Architekturen, denn haben die Befehle eines oder zwei einheitliche Formate so kann das komplette Befehlsbündel schneller dekodiert werden. Zudem braucht man wenn man mehrere Recheneinheiten auflasten will ohne zu viele Konflikte mit gemeinsam genutzten Registern zu haben sehr viele Register, die man vor allem bei RISC Architekturen findet. Der Itanium hat jeweils 128 Ganz- und Fließkommaregister, die TMS320C Familie für zwei ALU jeweils vier Registerfiles von 16 Registern Größe, die durch das Programm ausgetauscht werden können.

Ein Nachteil ist, das theoretisch für das holen der langen befehle der Bus zum Speicher ebenfalls sehr breit sein muss (128 Bit beim Itanium, 256 sogar bei der TMS-Familie). Aus Kostengründen ist er aber meist nicht so breit. Stattdessen ist der Speicher mit einem "normal-breiten" Bus angebunden und ein Prozessorinterner Cache oder sogar dezidierter (adressierbarer) Speicher auf der CPU wie bei der TMSC Architektur hat dann den breiten Bus und puffert die Zugriffe auf den Speicher ab. Die TMS320C62X Familie hat zudem noch eine Harvard -Architektur bei der Code- und Datenspeicher getrennt und unterschiedliche Busse haben. Auch das ermöglicht es den Bus für den Code anders auszulegen als den für die Daten.

Die gleiche Problematik gibt es intern: je mehr Befehle parallel verarbeitet werden können, desto mehr Datenpfade muss es zu den Einheiten geben, da ein Befehl ja an jeder Position des langen Wortes sein kann. Bei der erwähnten TMS320C62X Architektur wären es durch die acht Operationen pro Befehl 24 Routen vom VLIW zu den Ausführungseinheiten. Zum Vergleich: beim Pentium III/4 waren es nur 5 Ports an denen die Ausführungseinheiten lagen. Texas Instruments löste das Dilemma auf indem es zwei Gruppen gab die nur jeweils 4 Befehle einer Hälfte eines Worts verarbeiteten,

Intel hat für die 9 Ausführungseinheiten des Itanium Prozessor eine Variante namens EPIC (Explicitly Parallel Instruction Computing) von VLIW eingeführt. Bei dieser gibt es in einem 128 Bit VLIW Bündel neben drei Befehlen à 41 Bit Breite noch 5 Bits welche die Abhängigkeiten der Befehle beschreiben. So kann man auch Befehle einfügen die nicht parallel abgearbeitet werden. Der Prozessor kann dies anhand der 5 Statusbits erkennen, dann sinkt zwar die Geschwindigkeit etwas, aber man nutzt den Speicher besser aus. Es sind 24 Kombinationen aus Integeranweisung, Speichertransfer, Fließkommaanweisung und Verzweigung denkbar.

Neben dem Itanium Prozessor setzt von den in PC eingesetzten Prozessoren nur der Crusoe Kern von Transmeta eine VLIW Architektur ein. Hier werden die IA86 Instruktionen umkodiert in 128 Bit lange VLIW Worte und dann vom VLIW Kern verarbeitet. Dafür hat der Prozessor ein 16 MB Flash Memory, in dem das Umkodierungsprogramm gespeichert wird. Gerade bei diesem Prozessor zeigte sich aber, dass die Compiler oft nicht die Befehle so gruppieren konnten, dass man die einzelnen Einheiten optimal auslastete. Auch das mag ein Grund gewesen sein, Weshalb Intel zwischen 2003 und 2014 kaum neue Funktionseinheiten einführte, stattdessen auf mehr Kerne oder eben SIMD Anweisungen setzte.

Der Itaniumprozessor ist nicht der erste Prozessor der dieses Problem hat. Eine ähnliche Erfahrung machte Intel schon mit dem IAPX 860, der ebenfalls eine VLIW Architektur war. Auch hier erreichten Compiler nur einen Bruchteil der Spitzenleistung. Allerdings galt dieser Prozessor als schwer programmierbar, und auch Assembler erreichte maximal die halbe Peakperformance.

VLIW Architekturen werden aber auch eingesetzt, weil sie andere Vorteile haben, selbst wenn es nicht um das Parallelisieren geht: Die Befehlsworte sind immer gleich lang (notfalls muss man mit Füllbytes auffüllen), das erlaubt es immer den gleich großen Datenblock aus dem Speicher zu holen. Legt man die Größe z.B. auf 64 Bytes fest, so entspricht dies genau der Größe eines Datenblocks den DDR-Speicher beim Zugriff liefert, das bedeutet man kann damit die Latenz des Speichersystems kaschieren. Daher gab es schon früher solche Mechanismen. CDC setzte dies in der CDC Star bzw. ihren Nachfolgemodellen CDC Cyber 203 und 205 und ETA 10 ein. Hier wurden 8 Befehle von 60 Bits breite zu einem 480 Bit breiten "Superwort" verschmolzen. Auf den Speicher wurde nur in vielfachen dieser Superworte zugegriffen. Man hatte dadurch einen Datenbus von 480 Bit Breite, kompensierte also den langsamen Speicher durch Bandbreite.

Heute sorgen Caches für ein Zwischenspeichern von Daten, weshalb x86-Prozessoren auch ohne VLIW Architekturen schnell sind. VLIW konnte sich anders als SIMD nie im Massenmarkt durchsetzen.

Zusammenfassung

Im PC Markt haben sich VLIW und SIMD noch nicht so durchsetzen können. Dies liegt vor allem daran, dass sie bei fast allen Prozessorlinien auf ein bestehendes Design "aufgesetzt" wurden. Die Akzeptanz blieb damit weitgehend aus. Chancen dürften diese Architekturen im PC Bereich wohl nur bei einer neuen Generation von Prozessoren, die sie von vorneherein unterstützen, haben. Doch diese sind nicht in Sicht.

Anders sieht es bei dem Gebiet der Signalverarbeitung aus. Dieser Markt ist auch viel größer und vielfältiger, auch wenn es dort nicht die großen Verdienstspannen wie beim PC Markt gibt. VLIW ist dort schon eine verbreitete Architektur, SIMD wird von vielen Prozessoren unterstützt. Eine hybrider Markt ist der von Grafikprozessoren. Diese kombinieren einen "normalen" Prozessor für die Berechnung von Bewegungen und visuellen Effekten mit einem digitalen Signalprozessor für die Texturüberlagerung, Zeichen der Polygone und Transformationen der Koordinaten. Schon heute schlagen Grafikprozessoren jeden PC Prozessor in Punkto Rechenleistung und Speicheranbindung.

Ebenso nutzen Supercomputer die heute auch aus Tausenden von Prozessoren von AMD, Intel, aber auch IBM und Oracle bestehen diese Befehlserweiterungen, hier kann die Software angepasst werden, was angesichts von Investitionen im Millionenbereich dann auch angebracht ist.

Artikel erstellt: zirka 2001

Artikel zuletzt überarbeitet 7.12.2014



© des Textes: Bernd Leitenberger. Jede Veröffentlichung dieses Textes im Ganzen oder in Auszügen darf nur mit Zustimmung des Urhebers erfolgen.

Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensläufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.

Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.

Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.

Mehr über das Buch auf dieser eigenen Seite.

Hier geht's zur Gesamtübersicht meiner Bücher mit direkten Links zum BOD-Buchshop. Die Bücher sind aber auch direkt im Buchhandel bestellbar (da ich über sehr spezielle Themen schreibe, wird man sie wohl kaum in der Auslage finden) und sie sind natürlich in den gängigen Online-Plattformen wie Amazon, Libri, Buecher.de erhältlich.

Sitemap Kontakt Impressum / Datenschutz Neues Hier werben / advertisment here Buchshop Bücher vom Autor Top 99