Am Einsatz der
Streaming SIMD Extensions (kurz
SSE) führt bei der Entwicklung von Computerspielen heutzutage kein Weg mehr vorbei. Betrachten wir als konkretes Beispiel einmal die Addition zweier 4-dimensionaler Vektoren. Ohne Verwendung der SSE-Befehlssatzerweiterung sind hierfür vier Additionen (Instruktionen) erforderlich:
x3 = x1 + x2;
y3 = y1 + y2;
z3 = z1 + z2;
w3 = w1 + w2;
Dank des SSE-Befehlssatzes lassen sich die vier einzelnen Additionen jedoch mit einer einzigen Instruktion durchführen (
Single
Instruction,
Multiple
Data kurz
SIMD), wodurch ein enormer Performance-Gewinn erzielt werden kann - jedenfalls dann, wenn eine große Anzahl derartiger Berechnungsschritte erforderlich ist.
Bevor die eigentlichen Berechnungen durchgeführt werden können, müssen wir die einzelnen Vektorkomponenten (jeweils 32-Bit) zunächst in einem 128-Bit Datentypen kopieren (
__m128 für Fließkommaberechnungen,
__m128i für Ganzzahlberechnungen).
Für den Umgang mit diesen Datentypen und die Durchführung von Berechnungen stellt uns der C/C++ Compiler sogenannte
SSE-Intrinsics zur Verfügung. Betrachten wir hierzu einige Beispiele:
4 float-Variablen (x, y, z und w) zu einem 128-Bit-Datentypen zusammenfassen:
typedef __m128 vec4;
vec4 v1 = _mm_set_ps(w, z, y, x)
Addition:
vec4 v1, v2, v3;
v3 = _mm_add_ps(v2, v1);
Subtraktion:
vec4 v1, v2, v3;
v3 = _mm_sub_ps(v2, v1);
4 float-Variablen aus einem 128-Bit-Datentypen auslesen:
__declspec(align(16)) float result[4];
_mm_store_ps(result, v3);
Mithilfe der nachfolgenden weiterführenden Links sollte es nun kein Problem darstellen, sich in die Geheimnisse der SSE-Programmierung einzuarbeiten: