Einzelne Anweisung, Mehrere Daten
Eine sehr interessante Technologie für Videospiele ist SIMD, ausgeschrieben Single Instruction Multiple Data, d.h. eine Anweisung, aber viele Daten. Ein Beispiel dafür ist, dass man fast überall eine Position ändern muss, was zum Beispiel so aussehen kann:
positionX += zeit * geschwindigkeitX;
positionY += zeit * geschwindigkeitY;
positionZ += zeit * geschwindigkeitZ;
Das +=
heißt hier erhöhe den Wert links um den Wert rechts. Damit sind dies sechs Berechnung, bestehend aus drei Additionen und drei Multiplikationen, und man kann überschlagsmäßig behaupten, dass sie sechs Zeiteinheiten brauchen. Mit SIMD wird daraus im Pseudocode folgendes:
position += zuVektor(zeit) * geschwindigkeit;
Die beiden Variablen sind hier Vektoren, bestehend jeweils aus mehreren Komponenten (üblicherweise 4). Abgesehen von dem zuVektor-Dingens (was man oft beseitigen kann) sind wir hier auf nur zwei Operationen herunter, um den selben Effekt zu haben, und brauchen auch nur zwei Zeiteinheiten, da die Additionen und Multiplikationen jetzt parallel geschehen.
Verschiedene Versionen von SIMD sind Altivec bei PowerPC-Prozessoren, die ganzen SSEs bei Intel und, und hier wird es interessant, NEON auf ARM-Prozessoren. ARM-Prozessoren stecken in so ziemlich allem, aber unter anderem sind sie auch die CPUs im iPhone und dem iPod Touch. Die ersten beiden Generationen des iPod Touch sowie des iPhones (iPhone und iPhone 3G) verwenden einen sogenannten ARMv6 Prozessor ohne NEON. Das iPhone 3GS und der dritte iPod Touch aber verwenden einen ARMv7 “Cortex”-Prozessor, der NEON hat.
Apple gibt dies nirgendwo, auch für Entwickler nicht, zu, aber wenn man den Anweisungen auf http://monkeystylegames.com/?p=82 folgt, dann kann man tatsächlich NEON-Code erzeugen, der die ganzen Vorteile ausnutzt und auf dem iPhone funktioniert. Wenn man auch eine Nicht-NEON-Version des Codes hat (die ich sowieso schon hatte), dann kann man Code für sowohl einen reinen ARMv6 als auch für den Erweiterungen des ARMv7 übersetzen lassen und erhält, wie zuletzt bei der PowerPC-zu-Intel-Umstellung, eine Universal Binary die auf beidem läuft. Bei meinem Eisenbahnsimulator geht das prima.
Ob ich es aber tatsächlich einsetzen werde ist eine andere Frage. Es vergrößert erst mal das Programm geringfügig (im Augenblick um etwa 80 kB, aber das kann noch mehr werden) und natürlich muss man auf beidem testen. Da ich aber sowieso derzeit nicht plane, unterschiedliche Spiele für alte und neue Geräte zu machen, habe ich keinen echten Vorteil, denn das iPhone 3GS ist auch ohne diesen Code schon deutlich schneller als jedes ältere Gerät. Zu guter letzt hilft es mir aber sowieso kaum: Die meiste Energie verwendet das Programm beim Rendern, was von der Grafikkarte erledigt wird. Die Teile, die ich mit NEON optimiert hatte, waren weder vorher noch hinterher in irgend einer Form kritisch. Insgesamt also eher ein nettes Forschungsprojekt als tatsächlich etwas sinnvolles.
Geschrieben am 18. Oktober 2009 um 17:17