GPGPU - General Purpose Computation on Graphics Processing Unit
GPGPU (General Purpose Computation on Graphics Processing Unit) ist eine Programmier-Schnittstelle mit der Möglichkeit, allgemeine Berechnungen vom Grafikprozessor (GPU) auf der Grafikkarte ausführen zu lassen. GPGPU ist beim High Performance Computing (HPC) ein fester Bestandteil.
Die ursprüngliche Aufgabe von Grafikchips ist, den Bildschirm mit Pixel zu füllen. Inzwischen eignen sich die umfangreichen Befehlssätze der GPUs auch für allgemeine Berechnungen. Im Gegensatz zu den üblichen HPC-Beschleunigern sind Grafikkarten Massenware und deshalb günstiger. Doch Vorsicht: Die Zuverlässigkeit von GPGPU ist nur begrenzt. Wer die Fehlerrate von Grafikkarten, deren Treiber und Speicher kennt, der wird die Zuverlässigkeit von GPGPU sofort als schlecht einschätzen können. Denn Grafiktreiber verursachen die häufigsten Computer-Abstürze.
GPGPU ist ein vergleichsweise neuer Trend in der Computertechnik, der darauf abzielt freie Rechenleistung konsequent auszunutzen. Was sich im ersten Moment gut anhört hat spielt in der Praxis kaum eine Rolle. Der Grund, die GPU-Beschleunigung für allgemeine Rechenaufgaben hilft in der Praxis selten.
Die GPGPU-Technik hat sicherlich großes Potential. Doch die Softwareentwicklung schreitet, was Notebooks und Desktop-PCs angeht, nur sehr langsam voran, so dass Spezialfunktionen kaum genutzt werden. Viele PC-Nutzer sind auf die reine CPU-Leistung angewiesen.
Im privaten Bereich gibt es praktisch keine Anwendung für GPGPU. Ausnahmen sind Programme für die Videobearbeitung. Typische Alltagssoftware lässt sich kaum parallelisieren. Im Bereich der Wissenschaft und Technik sieht es dann schon wieder anders aus. Hier machen mehrere GPGPU-taugliche Grafikkarten einen normalen PC zu einem Supercomputer.
Voraussetzung dafür ist ein hochleistungsfähiger Grafikprozessor, der bis zu 800 Kerne hat und parallel arbeitet. Damit ein Grafikprozessor überhaupt sinnvoll genutzt werden kann, muss die Anwendung eine sehr hohe Zahl von parallel ausführbaren Berechnungen enthalten. Wenn man die Rechenwerke eines Grafikprozessors kontinuierlich auslasten will, dann sollte man mindestens eine Millionen gleichartiger Berechnungen liefern können, sonst hat man gegenüber einer normalen CPU keine Vorteile. Die GPU-Rechenwerke müssen mit einem kontinuierlichen Datenstrom versorgt werden. Aus diesem Grund bezeichnet man sie auch als Stream-Prozessoren.
Anwendungen
- physikalisch Simulationen (Strömung, Gravitation, Temperatur, Crash-Tests)
- komplexe Klimamodelle (Wettervorhersage)
- Datenanalysen und Finanzmathematik
- Verarbeitung von akustischen und elektrischen Signalen
- CT- und Ultraschall-Bildrekonstruktion
- Modellieren von Molekühlstrukturen
- Kryptografie
- neuronale Netze
GPGPU-Software
Ein GPGPU-Programm besteht aus mindestens zwei Teilen. Der eine Teil enthält das Programm für die CPU. Hier wird auch die Grafikkarte gesteuert, die Daten für die Grafikkarte geladen und die Ergebnisse wieder abgeholt. Der zweite Teil wird als Kernel bezeichnet. Er legt die Instruktionen für die GPU fest.
Da der Programmcode in der Regel nicht direkt ausgeführt werden kann, muss der GPU-Teil zuerst in eine Hardware-nahe Sprache übersetzt werden. Ein spezieller Assembler übersetzt diesen Code dann in eine Sprache für die jeweils installierte Grafikkarte.
GPGPU-Programme, die eine GPU zu 50 bis 60 Prozent auslasten können, gelten schon als sehr gut. Der Grund: Grafikchips reagieren sehr empfindlich auf Wartezeiten durch Speicherzugriffe. Da man die kontinuierliche Datenlieferung nur bedingt erfüllen kann, gibt man sich bereits mit einem kleinen Wirkungsgrad zufrieden. Je geringer die Speicherzugriffszeit ist, desto besser. Optimierungen sind nur bedingt möglich.
Geschichtliche Entwicklung
Angefangen hat alles im Jahr 2002, als die damals vorgestellten DirectX-9-Grafikchips mit programmierbaren Pixel-Shader-Einheiten erstmals die Voraussetzungen für technisch-wissenschaftliche Anwendungen erfüllten.
Einen weiteren Sprung in der Entwicklung gab es, als 2004 die erste Programmierschnittstelle für allgemeine Berechnungen auf Grafikkarten von der Stanford-Universität mit dem Namen "BrookGPU" erschien. Damit war es möglich, den Grafikprozessor als mathematischen Coprozessor zu verwenden.
Wenig später teilten sich die BrookGPU-Entwickler in zwei Lager. Die einen gingen zu Nvidia und entwickelten dort die GPU-Schnittstelle CUDA (Compute Unified Device Architecture). Die anderen Entwickler gingen zu AMD und entwickelten dort eine Version für Radeon-Grafikkarten mit dem Namen "Brook+", die später in Stream umbenannt wurde.
Stream und CUDA haben also den selben Ursprung. Deshalb ist der Unterschied zwischen CUDA und Stream an sich nicht sehr groß. Allerdings handelt es sich in beiden Fällen um propritäre GPGPUs, die zueinander nicht kompatibel sind.
Weil CUDA und Stream an GeForce- bzw. Radeon-Grafikkarten gebunden sind, was für die Entwicklung kommerzieller Software für den Massenmarkt uninteressant ist, wurden zusätzlich OpenCL (Khronos Group) und DirectX Compute Shader (Microsoft) entwickelt. Beide Programmier-Schnittstellen sind Hardware-unabhängig.
Microsoft versucht auch im GPGPU-Bereich Fuß zu fassen. Deshalb hat Microsoft eine GPGPU-Implementierung für DirectX 11 mit der Bezeichnung "Compute Shader" vorgesehen. Wie OpenCL ist DirectX Compute Shader unabhängig von der Hardware.
Während CUDA sehr bekannt ist, ist von Stream kaum etwas zu hören. Außer von AMD gibt es über Stream kaum Informationen. Während Nvidia die Bedeutung von GPGPU im wissenschaftlichen Umfeld erkannt hat, hat AMD die Entwicklung lange Zeit verschlafen. Stream spielt heute eigentlich keine Rolle mehr. AMD setzt deshalb auf OpenCL, das aber weniger Features hat als CUDA.
CUDA von Nvidia
CUDA ermöglicht die Nutzung aktueller Grafikkarten von Nvidia für beinahe beliebige Berechnungen. Die Bekanntheit und weite Verbreitung von CUDA dürfte der Erfolg der Nvidia-Marketing-Abteilung sein, die die Nutzung von CUDA insbesondere an US-Universitäten gefördert hat. Deshalb ist CUDA im Bereich der Wissenschaft und Technik sehr stark verankert. Besonders an Universitäten gilt CUDA als Synonym für GPGPU. Es gilt als leicht erlernbar. Die Begrenzung auf GeForce-Grafikkarten ist allerdings ein Problem. Deshalb hat Nvidia den Quellcode seines CUDA-Compilers veröffentlicht. Damit soll die Technik für neue Programmiersprachen und alternative Prozessor-Architekturen zugänglich gemacht werden. Zum Beispiel auch die Grafikprozessoren von AMD und Intel.
OpenCL - Open Computing Language (Khronos Group)
OpenCL ermöglicht die Programmierung der Anwendungen in C, die auf OpenCL-kompatiblen Prozessoren laufen. Während CUDA (Nvidia) und Stream (AMD) nur auf den jeweils unterstützten Grafikkarten laufen, eignet sich OpenCL der Khronos Group, die auch für OpenGL verantwortlich ist, nicht nur für Nvidia- und AMD-Grafikprozessoren. Auch andere Grafikprozessoren, der Cell-Prozessor oder verschiedene DSPs können zur parallelen Datenverarbeitung genutzt werden. OpenCL ist praktisch unabhängig von der Grafikkarte und funktioniert sogar auf Apple-Rechnern.
Auffallend ist, dass OpenCL und CUDA sich sehr ähnlich sind.
Compiler-Unterstützung
OpenCL und CUDA sind Low-Level-APIs, die es dem Programmierer einfacher machen sollen GPGPU-Software zu schreiben. Compiler-Bauer wollen noch weiter gehen und die Parallelisierung auf GPUs dem Compiler überlassen, so dass sich der Programmierer darüber keine Gedanken mehr machen muss.
Hierzu gibt es von verschiedenen Herstellern Erweiterungen für verschiedene Programmiersprachen:
- Microsoft AMP und Intel Cilk für C++
- OpenMP für C++ und Fortran
- OpenACC von Nvidia, PGI, Cray und CAPS für C++ und Fortran