SIMD-Optimierungen

Ich habe nun für einige bestimmte Funktionen alternative, optimierte Implementierungen gebaut, die auf SIMD-Technologien basieren, insbesondere 3DNow! und „einfaches“ SSE (bisher). Durch SIMD-Technologien (SIMD: Single Instruction Multiple Data) können nämlich die 64- (3DNow!) bzw. 128-Bit-Register (SSE) des Koprozessors genutzt werden, um durch paralleles Rechnen tierisch den Zeitvorteil zu verwirklichen. So lassen sich zeitkritische Operationen wie zum Beispiel Dividieren, Multiplizieren oder gar Wurzelziehen auf zwei (3DNow!) bzw. vier (SSE) Werten auf einen Schlag durchführen.

Als ein Beispiel seht ihr im Folgenden die SSE-Version der Funktion „vec3norm“, die eine Menge von 3D-Vektoren normalisiert (so dass als Resultat alle Vektoren die Einheitslänge 1 haben). Geil:

vec3norm_sse

Ist das herrlich! Assembler ist jawohl echt mal ne geile Sache, oder? Ich finde ja! Sieht optisch schon tierisch krass aus! Und geht natürlich speedmäßig volle Kanne ab! Gut, heutige C++-Compiler generieren dermaßen optimierten Code, dass es sich meistens nicht lohnt, selbst zu Assembler zu greifen. Aber der Einsatz von SIMD-Technologien sieht da schon wieder ganz anders aus.

Bisher habe ich noch keine ausgiebigen Tests durchgeführt, um den tatsächlichen Vorteil der SIMD-Implementierungen zu analysieren. Aber das werde ich wohl bald machen und die Ergebnisse dann hier an den Tag kloppen.

Hinterlasse eine Antwort