Posts mit dem Label Streaming SIMD Extensions werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Streaming SIMD Extensions werden angezeigt. Alle Posts anzeigen

SSE (Streaming SIMD Extensions)-Programmierung

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: