Archiv für November 2008

Projektstatistik 11/2008

Sonntag, 30. November 2008

Wie bereits angesprochen, habe ich vor, monatlich eine kleine Projektstatistik offenzulegen — oder wie auch immer man das nennen will. Nach etwas mehr als einem Monat ist es dafür wieder soweit. Im Laufe des vergangenen Monats habe ich mich vor allem mit der SIMD-Optimierung, dem Konvertieren, Laden und Speichern von 3D-Modellen sowie dem Grundgerüst des Shader-Systems auseinander gesetzt. Aus der aktuellen und der vorigen Statistiktabelle geht hervor, dass das Projekt dabei um ca. 7.000 Zeilen reinem Code reicher geworden ist (also ungeachtet der Kommentare und Leerzeilen):

Zeilen gesamt Nur Code Nur Kommentare Code mit Kommentaren Leerzeilen Nicht-Leerzeilen
86.115 36.935 27.034 2.313 19.833 66.282
100 % 43 % 31 % 3 % 23 % 77 %

(Zur vorigen Tabelle geht es hier.)

Interessant zu beobachten wird wohl die Entwicklung der Verhältnisse von Code, Kommentaren und Leerzeilen sein (die Prozentzahlen in der Tabelle). Denn diese sind im Laufe des vergangenen Monats nahezu identisch geblieben. Witzig!

Geburtstag

Donnerstag, 27. November 2008

Heute ist der 27. November. Das ist der Geburtstag von Cyber und Elsa. Cyber und Elsa sind im Gegensatz zu dem, was einige Leute denken, nämlich gar kein Pärchen im Sinne von Männlein und Weiblein, sondern Geschwister. Obendrein sind sie Zwillinge. Sie haben heute am 27. November gemeinsam Geburtstag und planen, eine riesen Sause zu veranstalten. Natürlich wünschen sich beide irre viele Geschenke! Das ist ja das Geilste an Geburtstagen: Geschenke! Ein guter Freund von Cyber und Elsa, nämlich Münninger, sagte einst über Geschenke: “Von Herzen müssen sie nicht kommen, aber teuer sollen sie sein!” Das trifft es wohl auf den Punkt! Zumindest findet Elsa das. Cyber ist in dieser Hinsicht nicht ganz so krass wie Elsa. Er ist mit sehr viel weniger zufrieden. Aber Elsa, herrje — wenn du ihr den Finger hinstreckst, reißt sie dir den ganzen Arm heraus! Bildlich gesprochen! Obwohl’s auch schon tatsächlich passiert sein soll!

Elsa freut sich natürlich über Blumen, ganz klar. Sie ist ja schließlich ein Mädel. Oder wie einige Leute sagen würden, die sich des modernen Slangs bedienen: Elsa ist ein weltklasse Frauenzimmer mit einer tierisch geilen Performance! Oh ja, das ist sie, Baby!

Einen Strauß Blumen hat Elsa heute bekommen. Den findet sie auch geil. Aber worüber sie sich richtig gefreut hat, ist das H&K-G3, das Cyber ihr geschenkt hat. Elsa ist manchmal recht nostalgisch unterwegs: Sie steht nicht so auf die Waffen, deren Software Cyber programmiert. Sie schießt lieber mit altmodischen Waffen wie .45-Kaliber-Pistolen oder 7.62mm-Gewehren. Cybers Waffe hingegen — die Bärenpranke 9000 — ist mit modernster und raffiniertester Highend-Software ausgestattet, die Cyber natürlich selbst programmiert hat.

Erste Tests der SIMD-Optimierungen

Donnerstag, 20. November 2008

Bei der Nutzung von SIMD entsteht lediglich ein geringer Overhead, um die “breiten” 64- bzw. 128-Bit-Register vor den eigentlichen Operationen mit Werten zu füllen, und die Resultate aus den Registern zu extrahieren und zurück in den Speicher zu schreiben. Der Speedvorteil überwiegt den Overhead, selbst bei geringen Datenmengen. Nur ist die Frage, ob es sich lohnt, sich für geringe Datenmengen hinzusetzen und in Assembler zu programmieren, was ja doch schon einen gewissen Aufwand mit sich bringt.

Für größere Datenmengen macht sich der Speedvorteil tierisch bemerkbar und da kann es sich unter Umständen tatsächlich lohnen, mal ein bisschen Assembler zu programmieren. Mir persönlich macht es sogar Spaß, insofern würde ich es auch ohne den so hohen Zeitvorteil machen.

Den Unterschied zwischen geringen und großen Datenmengen sowie den zwischen einer regulären Implementierung in C++ und Implementierungen unter Verwendung von SIMD möchte ich anhand folgender Tabelle demonstrieren:

Tech. / # Vek. 1 10 100 1.000 10.000
C++ 100,0 % 100,0 % 100,0 % 100,0 % 100,0 %
SSE 103,9 % 99,9 % 49,8 % 26,8 % 24,6 %
3DNow! 115,4 % 97,2 % 48,4 % 26,0 % 24,0 %

Die Tabelle enthält die “Performance” (in Form des relativen Zeitaufwands) von drei verschiedenen Implementierungen einer Funktion “vec3trans”, die eine Menge von 3D-Vektoren mit einer 4×4-Matrix transformiert. Die Prozentwerte in der Tabelle stellen die jeweilis zur Ausführung der Funktion benötigte Zeit in Relation zur Referenzimplementierung in C++ dar. Es wurden pro Implementierung jeweils 1 Vektor, 10, 100, 1.000 und 10.000 Vektoren transformiert. Pro Implementierung und Anzahl Vektoren wurden die Ergebnisse mehrerer Durchläufe gemittelt, um unerwünschte äußere Einflüsse “wegzuglätten”.

Der relativ hohe Overhead in der ersten Spalte der Tabelle (Anzahl Vektoren 1) ist nicht auf den Einsatz von SIMD zurückzuführen. Vielmehr liegt es daran, dass die Transformationsmatrix vor den SIMD-Operationen transponiert wird, um dann die Transformation vieler Vektoren weiter zu beschleunigen. Das führt, wie man sieht, bei geringen Datenmengen leider zu einem Nachteil. Würde die Matrix nicht erst transponiert, wäre der Speedvorteil selbst bei einer geringen Datenmenge von einem Vektor bereits zu erkennen. Was bleibt, ist der bei höher werdender Datenmenge steigende (aber konvergierende) Speedvorteil. Und dieser ist doch schon beachtlich: Die SIMD-Implementierungen benötigen bei größeren Datenmengen nur ca. ein Viertel der Zeit im Vergleich zur Referenzimplementierung in C++. Wahnsinn!

Eine Menge von 10.000 3D-Vektoren entspricht übrigens einem schon recht großen 3D-Modell, wie es in Cyber E-Razor rockt die Galaxis garantiert nicht geben wird. Die bisherigen 3D-Modelle umfassen maximal ca. 1.500 Vertizes (Vertizes: Eckpunktvektoren des 3D-Gittermodells, grob gesagt). Selbst diese Modelle sollte ich für den Einsatz im Spiel noch optimieren, das heißt in diesem Fall, möglichst ohne großen optischen Qualitätsverlust weniger (als 1.000?) Vertizes verwenden.

SIMD-Optimierungen

Donnerstag, 13. November 2008

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.

FaceLabs-Demo

Sonntag, 02. November 2008

So Freunde, es ist soweit: Hier ist der erste Download für euch! Es handelt sich dabei um eine kleine FaceLabs-Demo bei der man ein kleines Fenster zu sehen bekommt, in dem man ein paar Visualisierungseinstellungen vornehmen kann.

Wer Bock hat, kann auch gerne ein bisschen an den ini- und tga-Dateien rumspielen, um das Design zu individualisieren. Falls es dabei Unklarheiten gibt, beantworte ich natürlich gerne entsprechende Fragen. Ihr dürft mir auch gerne eure eigenen Entwürfe schicken. Vielleicht schafft es ja ein Design oder Teile davon bis ins Spiel.

Beim Start der exe-Datei wird eine html-Datei erzeugt, die ggf. ein paar Fehlermeldungen enthält. Das Programm benötigt auf jeden Fall DirectX 9 und ein Windows-NT-Betriebssystem (vielleicht funzt auch ME oder so, aber das konnte ich bisher nie testen). Falls das Programm bei der Ausführung zu Problemen führt, sollten in der html-Datei Fehlermeldungen auftauchen, die mich in Kombination mit euren Systeminfos interessieren würden. Falls das kleine Programm problemlos ausgeführt werden kann, sollte etwas zu sehen sein, was ungefähr dem folgenden Screenshot entspricht (abgesehen von schwarzem Hintergrund und ein bisschen Text, was nicht im Screenshot enthalten ist):

(Der Info-Button hat bisher übrigens keinerlei Funktion.)