Alexander Rudolph

Erfolgreiche Spieleentwicklung –

OpenCL

ISBN: 978-3-86802-425-8
© 2012 entwickler.press
Ein Imprint der Software & Support Media GmbH

Einleitung

OpenCL in der Spieleentwicklung – eine gute Idee?

Bei Besitzern von AMD-Grafikkarten herrscht regelmäßig dicke Luft, wenn das nächste Top-Spiel mit atemberaubenden Physik-Effekten beworben wird, aber nur auf NVIDIA-Grafikkarten lauffähig ist. Muss das so sein? Eigentlich nicht, denn die OpenCL-Technologie ermöglicht GPU-beschleunigte Berechnungen auf NVIDIA- und auf AMD-Grafikkarten sowie Multithread-optimierte Berechnungen auf allen gängigen CPU-Typen.

Im ersten Teil dieses shortcuts befassen wir uns mit den Grundlagen der OpenCL-Programmierung. Im Anschluss daran erörtern wir den Aufbau und die Funktionsweise einer OpenCL-basierten Physik-Engine und erweitern diese im dritten Kapitel durch zusätzliche Simulationen von Luft-, Wasser- und Landfahrzeugen.

Das aktuelle OpenGL/OpenCL-basierte Grafik- und Physik-Framework, das diesem shortcut zugrunde liegt, sowie eine große Zahl interessanter Beispielprogramme stehen auf den folgenden Internetseiten zum Download bereit:

http://www.graphics-and-physics-framework.spieleprogrammierung.net/

http://www.entwickler-press.de/shortcuts/opencl

Weiterführende Artikel über 3D-Programmierung, Spielephysik, KI-Programmierung, etc. finden Sie unter:

http://www.spieleprogrammierung.net/

1 Asteroidenhagel selbst gemacht

Seit der Integration des PhysX-Frameworks in die NVIDIA-Produktfamilie im Jahr 2008 und der Entwicklung einer GPU-beschleunigten Physikbibliothek (kurz GPU PhysX) auf Basis des von NVIDIA bereitgestellten CUDA APIs, zählt die Berechnung von Physikeffekten auf der GPU sowohl bei Entwicklern als auch bei Spielern zu einem der meistdiskutierten Themen. Realistisches Verhalten von Wasser auf Basis einer GPU-Fluidsimulation oder GPU-Partikeleffekten mit Tausenden von Partikeln stellen nur zwei der Möglichkeiten dar, wie aktuelle Spiele von der Leistungsfähigkeit moderner Grafikkarten profitieren können. Besitzer einer AMD-Grafikkarte müssen jedoch momentan in der Regel auf solche zusätzlichen GPU-Physikeffekte verzichten, da das dem GPU-PhysX-Framework zugrunde liegende CUDA API nur auf NVIDIA-Grafikkarten lauffähig ist.

OpenCL (Open Computing Language) könnte nun einen möglichen Ausweg aus diesem Dilemma bieten, denn es handelt sich hierbei um die zurzeit einzig verfügbare, gleichermaßen von Intel, AMD und NVIDIA unterstützte Technologie, mit deren Hilfe sich komplexe Berechnungen wahlweise auf der CPU oder der GPU durchführen lassen. Entwickelt wurde die OpenCL-Schnittstelle samt der zugehörigen Sprache OpenCL C von der Firma Apple in Zusammenarbeit mit IBM, AMD, Intel und NVIDIA. Am 8. Dezember 2008 erfolgte die Bekanntgabe der OpenCL-Spezifikation 1.0 durch die Khronos-Gruppe [1]. Die aktuelle Spezifikation 1.2, die nach wie vor vollständige Abwärtskompatibilität gewährleistet, wurde am 16. November 2011 veröffentlicht. Der grundlegende Aufbau einer OpenCL-Anwendung ist in Abbildung 1.1 skizziert.

Abbildung 1.1: Aufbau einer OpenCL-Anwendung

Die heutige und zukünftige Bedeutung der OpenCL-Technologie bemisst sich nicht zuletzt daran, dass sowohl Intel [2] als auch AMD [3] und NVIDIA [4] mittlerweile jeweils ein eigenes Software Development Kit (SDK) zum kostenlosen Download anbieten. Die Programmbeispiele auf der Verlagshomepage [6] wurden beispielsweise mit dem AMD APP SDK entwickelt, da dieses sowohl die Programmierung von OpenCL-Anwendungen für AMD-GPUs als auch für AMD und Intel CPUs ermöglicht. Hinzu kommt, dass die von AMD zur Verfügung gestellte OpenCL Runtime im Vergleich zur Intel OpenCL Runtime deutlich performantere Berechnungen auf der CPU ermöglicht, zumindest was die Programmbeispiele betrifft.

Einsatzmöglichkeiten in der Spieleentwicklung

Zunächst wurden die Einsatzmöglichkeiten von CUDA und OpenCL vorwiegend im wissenschaftlichen Bereich gesehen, denn durch die Ausnutzung der Leistungsreserven moderner Grafikkarten lassen sich die für komplexe Simulationen erforderlichen Rechenzeiten (Wetter, Astronomie etc.) erheblich verkürzen (GPGPU: General Purpose Computation On Graphics Processing Unit). Auch im Bereich Multimedia gibt es immer neue Anwendungsmöglichkeiten, beispielsweise bei der Bearbeitung von Bildern und Filmen. Für die Spieleentwicklung ist der Einsatz von OpenCL [5] insbesondere aus den folgenden drei Gründen sehr interessant:

Die konkreten Einsatzmöglichkeiten sind von der Art und dem Umfang des betreffenden Spiels abhängig. Betrachten wir hierzu einige Beispiele:

Wie sinnvoll der Einsatz von OpenCL für eine bestimmte Aufgabe ist, hängt entscheidend davon ab, ob und wie sich besagtes Problem parallelisieren lässt. Beim so genannten „aufgabenparallelen Multithreading“ wird eine Aufgabe als Ganzes in einem separaten Thread abgearbeitet (Beispiel: Streaming von Audio-, Geometrie- und Texturdaten). Beim „datenparallelen Multithreading“ wird eine Aufgabe hingegen in unabhängige Teilaufgaben zerlegt, die dann parallel zueinander in mehreren Threads bearbeitet werden. Auf die bekannten Werkzeuge zur Synchronisierung sollte hierbei wenn möglich verzichtet werden, denn Threads, die lange aufeinander warten müssen oder sich häufig gegenseitig blockieren, verringern den Vorteil der Parallelisierung.

Für alle Aufgaben, die sich datenparallel abarbeiten lassen, so auch für die zuvor besprochenen Beispiele (Teilaufgaben: Bestimme die Flugrichtung von Raumschiff i; Bestimme die Laufrichtung von Fußgänger i; Bestimme die Marktpreise für Sonnensystem i etc.), bietet sich der Einsatz von OpenCL an. Als Programmierer müssen wir uns nicht darum kümmern, wie viele Prozessor-Threads oder Shader-Einheiten auf den jeweiligen Rechnern zur Verfügung stehen, denn für die Aufteilung der Berechnungen ist die OpenCL Runtime verantwortlich. Wir können uns also uneingeschränkt mit der Parallelisierung der eigentlichen Aufgabe befassen.