Vektorprozessor
Vektorprozessoren führen eine Berechnung gleichzeitig auf vielen Daten (in einem Vektor bzw. Array) aus. Wenn viele gleichartige Daten auf gleiche Weise bearbeitet werden sollen (beispielsweise bei Matrizenoperationen), so sind Vektorprozessoren reinen General Purpose Prozessoren weit überlegen, die jedes Datum nacheinander bearbeiten.
Vektorprozessoren werden vor allem im High-Performance-Computing genutzt. Die legendären Cray-Supercomputer nutzten Vektorprozessoren und der über mehrere Jahre hinweg leistungsfähigste Computer der Welt, der Earth Simulator, arbeitet mit Vektorprozessoren von NEC. Gerade in HPC-Anwendungen fallen oft viele gleichartige Daten an, die auf ähnliche Weise verarbeitet werden sollen, so zum Beispiel bei Simulationen in der Meteorologie und Geologie, wo vielfach Vektorrechner verwendet werden.
Vektorrechner haben in den letzten Jahren große Konkurrenz durch massiv parallel aufgebaute Rechencluster bekommen, die aus vielen Tausend Standardprozessoren aufgebaut sind. Durch den Rückgriff auf Standardkomponenten, die über den HPC-Sektor hinaus verbreitet sind lassen sich Kosten sparen zumal solche Standardprozessoren durch die intensive technologische Entwicklung sehr leistungsfähig geworden sind.
Wegen der Vorteile die sich durch die gleichzeitige Ausführung einer Rechenoperation auf mehreren Daten ergeben (Single Instruction, Multiple Data, SIMD) haben auch Standardprozessoren seit den 1990er Jahren Erweiterungen der jeweiligen Architektur erfahren um diese Art von Berechnungen zu beschleunigen. Siehe dazu MMX, 3DNow!, AltiVec, SSE, SSE2.
Neben der oben genannten Anwendungen für Vektorprozessoren gehört auch die graphische Simulation zu einer Hauptanwendung. Gerade aufwendige 3D-Spiele verlangen enorm viele Berechnungen (Matrizenoperationen auf 3D-Koordinaten, Anti-Aliasing der Bildschirmausgabe) auf großen Datenmengen, weshalb heutige Grafikprozessoren große Ähnlichkeiten zu reinen Vektorprozessoren aufweisen.
Vektorprozessor bei der Arbeit
Anhand eines einfachen Beispiels soll der Unterschied zwischen Skalar- und Vektorprozessor ausgezeigt werden.
X und Y sind zwei Vektoren gleicher Länger und a ist eine skalar Grösse. Diese Problem wird auf Skalarprozessoren durch eine Schleiche gelöst. Die gleiche Schleife wird auch im Linpack Benchmark verwendet um die Leistung der getesteten Rechner zu bestimmen. In C-Syntax sieht das folgendermassen aus:
for (i=0; i <= 63; i++)
Y[i] = a * X[i] + Y[i];
Hier wird angenommen dass die Vektoren eine Länge von 64 Zeilen haben.
In MIPS-Code sieht diese Programmfrakment folgendermassen aus:
L.D F0, a ; skalar a laden
DADDIU R4, Rx, #512 ; letzte Adresse 512/8 = 64
Loop: L.D F2, 0(Rx) ; X(i) laden
MUL.D F2, F2, F0 ; a * X(i)
L.D F4, 0(Ry) ; Y(i) laden
ADD.D F4, F4, F2 ; a * X(i) + Y(i)
S.D 0(Ry), F4 ; Y(i) speichern
DADDIU Rx, Rx, #8 ; Index (i) von X inkremntieren
DADDIU Rx, Rx, #8 ; Index (i) von Y inkremntieren
DSUBU R20, R4, Rx ; Rand berechnen
BNEZ R20, Loop ; wenn 0, dann fertig
In VMIPS-Code sieht das ganz jedoch so aus
L.D F0, a ; Skalar a laden
LV V1, Rx ; Vector X laden
MULVS.D V2, V1, F0 ; Vector-Skalar Multiplikation
LV V3, Ry ; Vector Y laden
ADDV.D V4, V2, V3 ; Vektor Addition
SV Ry, V4 ; Resultat speichern
Diese Beispiel zeigt wie elegant der Vektorprozessor die Aufgabe löst. Bei VMIPS genügen 6 Befehle, während bei MIPS 64*9 + 2 = 578 Befehle ausgeführt wurden. Hauptsächlich entfällt die Schleife. Bei VMIPS muss also nur ein Bruchteil der Befehle aus dem Speicher geholt und dekodiert werden.
Bei der MIPS-Architektur werden Multiplikation und Additionen abwechseln ausgeführt, d.h. die Addition müss immer auf die längsamere Multiplikation warten. Beim Vektorrechner hingegen werden zuerst alle unabhängigen Multiplikationen ausgeführt und darauffolgend alle abhängigen Additionen. Dies ist ein weiterer bedeutender unterschied