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:


Einführung in die SSE-Programmierung:

http://www.codeproject.com/Articles/4522/Introduction-to-SSE-Programming



MMX, SSE und SSE2 Intrinsics:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28v=vs.71%29.aspx


SSE Performance Programming:

http://developer.apple.com/hardwaredrivers/ve/sse.html


SSE Optimization of the pe Physics Engine (Thomas Heller, Bachelor Thesis 2009):

http://www10.informatik.uni-erlangen.de/Publications/Theses/2009/Heller_BA09.pdf


Vergleich unterschiedlicher SIMD-Vektor-Implementierungen (VMATH, XNAMATH, VClass, VClassTypedef sowie VClassSIMDType):

http://altdevblogaday.com/2011/06/27/defining-an-simd-interface-redux/
http://donolmstead.me/2011/06/defining-a-simd-interface-redux/


Performance-Vergleich zwischen unterschiedlichen SSE2-Vektor-Implementierungen:

https://github.com/donny-dont/SIMD-Math-Test


XNA Math Framework:

http://blogs.msdn.com/b/chuckw/archive/2011/02/23/xna-math-version-2-04.aspx