Von der CPU zur GPU

0

Von Beginn an war die Berechnung einer der wichtigsten Anwendungsfälle für den Einsatz von Computern. In den Anfängen wurde nur mit Ganzzahlen oder sogenannten Festkomma-Zahlen – also quasi auch Ganzzahlen – gerechnet. Problematisch ist dabei, dass viele mathematische Operationen nicht im ganzzahligen Bereich bleiben, sondern reell-wertige Ergebnisse liefern, selbst wenn sie mit ganzen Zahlen aufgerufen werden.
Reell-wertige Zahlen sind aber in der Darstellung im Computer schwierig, nicht nur bei transfiniten Zahlen, sondern auch bei der Umsetzung der Repräsentation vom Dezimalsystem in das Binärsystem. Beispielsweise kann hier dann die Reihenfolge der Operationen bei einer Addition das Ergebnis verändern.
Einige Operationen, beispielsweise Sinus-Funktionen, lassen sich gar nicht exakt implementieren, sondern müssen durch Näherungen oder Tabellen abgebildet werden. Eine solche Näherung ist in der Ausführung aufwendig, da hier Schleifen in vielen Iterationen durchlaufen werden, je mehr Durchläufe, um so genauer das Ergebnis.
Dadurch hat speziell das wissenschaftlich-technische Rechnen einen dauerhaften „Hunger“ nach mehr Rechenleistung.
In den Anfängen wurden höhere mathematische Operationen in Programmbibliotheken, also Software, abgebildet und verwendeten nur die grundlegenden Rechenoperationen der Zentraleinheiten (Addition, Multiplikation). Die erzielte Rechenleistung war dementsprechend niedrig.

Co-Prozessoren

Der nächste Schritt war die Implementierung weitergehender Rechenoperationen in Hardware durch entsprechend konfigurierte Transistornetze. Die Begrenzung der auf einem Chip zur Verfügung stehenden Transistoren erforderte, dass diese Implementierungen in separaten Co-Prozessoren hergestellt werden mussten.
Diese Co-Prozessoren wurden dann neben der Zentraleinheit (CPU) auf die Mainboards montiert. Da aber Co-Prozessoren und CPU über nur schmale Kommunikationskanäle verfügten, bremste dies die Rechenleistung aus. Im Zuge der Erhöhung der Transistorenzahlen auf den Wafern wurden dann die Co-Prozessoren mit auf den zentralen „Die” integriert. Ein „Die“ – englisch für Würfel oder Plättchen – bezeichnet in der Halbleitertechnik den „nackten Chip“ ohne seine spätere Umhausung.

Parallelisierung

Ein weiterer Aspekt des wissenschaftlichen Rechnens, der wenig später zum Tragen kommt, ist die Parallelisierung der Operationen. Beispielsweise müssen bei Multiplikation zweier Matrizen die Multiplikationen einzelner Zellen nicht nacheinander durchgeführt werden, sondern sie lassen sich, da sie unabhängig voneinander sind, gut parallel abarbeiten.
Werden mehr Operationen parallel ausgeführt, steht natürlich auch das Ergebnis schneller zur Verfügung. Limitiert wird die Parallelisierung durch die Anzahl bereitstehender Speicherplätze beziehungsweise Register, in denen die Rechnungen durchgeführt werden.

Synergie: Die Computerspieleindustrie hat das wissenschaftliche Rechnen auf Grafikchips in den letzten Jahren vorangetrieben.

 

Gamer treiben die Entwicklung

Seit den letzten 5 bis 10 Jahren hat eine weitere Entwicklung große Auswirkungen auf das wissenschaftliche Rechnen: Die Computerspiele-Entwicklung. Ganz in den Anfängen hat sich die Darstellung des Spielstandes noch auf Textausgaben auf dem Bildschirm beschränkt, später dann auf Textmodus-Grafik-Darstellungen.
Das war natürlich nicht befriedigend, und daher wurde in diesem Bereich intensiv weiterentwickelt. Spielekonsolen („arcade games”) nutzten zunehmend separate Verarbeitungseinheiten, die sich um spezifische Grafikberechnungen kümmerten. Auch schon die ersten Home-Computer wie der Commodore Amiga hatten bereits so etwas wie Grafik-Co-Prozessoren.
Es entwickelte sich ein Wettlauf zwischen Spieleprogrammierern, die die Hardware immer weiter ausreizten, und den Grafikchip-Herstellern, die immer leistungsfähigere Systeme auf den Markt brachten. Die Gemeinde der Computerspieler nahm jede Verbesserung in Hardware oder Software begeistert auf und sicherte damit auch die Wirtschaftlichkeit der Entwicklungen.

GPU und Shader

Hatten die frühen Computerspiele noch sehr grobe Auflösungen und eine weitgehend zweidimensionale Darstellung, ging die Entwicklung über eine Pseudo-3D-Darstellung hin zu fotorealistischen Bildern, die inzwischen von Filmen fast nicht mehr zu unterscheiden sind.
Da die Inhalte der jeweiligen Spielsituation entsprechend berechnet werden müssen, muss die Grafikeinheit heute eine immense Rechenleistung mitbringen. Aufwendig sind dabei nicht notwendigerweise die einzelnen Berechnungen, sondern die schiere Menge an Bildpunkten, die berechnet werden muss. Die Berechnungsschritte sind dabei für die Bildpunkte im Wesentlichen gleich, nur die Eingangswerte unterscheiden sich.
Mit Konzepten wie „Shadern“ entwickelten sich Möglichkeiten, einfache Ablaufschritte variabel auf den Grafikprozessoren auszuführen. Die Berechnungen ähneln dabei sehr den Abläufen bei Matrizenmultiplikationen. Möglichkeiten, die sich hervorragend für das wissenschaftliche Rechnen nutzen lassen.

GPU – da fließen die Kommas

Für die Nutzung der GPU als Berechnungseinheit dienen keine Bildpunkte als Eingabedaten, sondern die entsprechenden Berechnungsinhalte. In den Anfängen stand noch eine niedrige Anzahl von Nachkommastellen zur Verfügung, weswegen die Einsatzmöglichkeiten der GPGPU für das wissenschaftliche Rechnen vor einiger Zeit noch eingeschränkt waren. Selbst als die Möglichkeit der Verarbeitung von 64-Bit-Fliesskommazahlen gegeben war, zeigte sich zunächst die Performance wesentlich geringer als bei 32-Bit-Zahlen. Erst mit den neueren Generationen der GPUs hat sich auch die 64-Bit-Performance gesteigert.
Heute spricht man vom sogenannten „General Purpose Computation on Graphics Processing Units“ (kurz GPGPU) – also die Verwendung eines Grafikprozessors für Berechnungen über seinen ursprünglichen Aufgabenbereich hinaus. Genutzt werden dafür sowohl Gamer-Grafikkarten oder auch spezielle Karten für HPC, Server oder Workstation-Anwendungen. Bei parallelen Algorithmen kann so eine enorme Geschwindigkeitssteigerung im Vergleich zum Hauptprozessor erzielt werden. Inzwischen sind die GPU so leistungsfähig, dass sie beim HPL-Linpack (der ein dicht besetztes lineares Gleichungssystem mit parallelen Berechnungen löst), dem Leistungstest für die Top-500-Liste der schnellsten Großrechner, Spitzenpositionen belegen.

Einschränkungen

Eine große Einschränkung beim Einsatz von GPGPU stellt derzeit die relativ geringe Größe des Speichers auf der Karte dar. Maximal können 16 GByte auf einer Karte untergebracht werden. Bei der Verarbeitung von größeren Datenmengen wird die Verarbeitung durch die dann notwendige Kommunikation über den PCI-Bus teilweise deutlich verlangsamt, insbesondere, wenn parallel auf mehreren Rechnern gearbeitet wird.
Damit sind für den Einsatz von GPGPU eher sogenannte „Embarrassingly-Parallel“-Programme geeignet, die zwar viele Verarbeitungsschritte parallel durchführen, zwischen den einzelnen Schritten aber keine Abhängigkeiten haben. So können die einzelnen Schritte unabhängig ausgeführt und sogar über mehrere Rechner ohne zusätzlichen Kommunikationsaufwand verteilt werden.

Praktischer Einsatz

In der Praxis gibt es derzeit zwei Varianten der Realisierung von GPGPU. NVidia verfolgt die traditionelle Bauweise, die spezialisierte Chips für die GPU auf Steckkarten platziert. Dabei gibt es inzwischen quasi zwei Baulinien, zum einen Karten, die auf den Gamer- und Consumer-Markt ausgerichtet sind, zum anderen Karten für den Einsatz als GPGPU oder Visualisierungsserver.
Neben dezidierten Grafikkarten für Gamer und professionellen Anwendern propagiert AMD auch sogenannte APUs, also eine Kombination von CPU und GPU auf einem Prozessor-Die. Die APUs, von AMD auch Fusion genannt, sind aktuell jedoch hauptsächlich für Low-Cost-Systeme im Laptop-Bereich im Einsatz. Die genutzte GPU ist ausgerichtet auf Video-Streaming und einfacheres Gaming. Diese haben bis dato noch keinen Einzug in das professionelle Berechnungsumfeld gehalten.

Unterschiedliche HPC-Typen

Im HPC-Umfeld können die Anwender in zwei Gruppen unterteilt werden: Die einen, die mit Compiler und Linker ausgerüstet, ihren eigenen Quelltext auf den Systemen zum Laufen bringen und die anderen, die das den Software-Hersteller erledigen lassen. Für die Compiler-Fraktion ist die Verwendung von GPGPU relativ einfach möglich, wenn der Quelltext der Anwendung „parallelisierungsfreundlich“ geschrieben ist.
Die anderen sind auf die Hersteller angewiesen, die ihre Software auf GPGPU portieren müssen. In der Praxis ist das ein längerer Prozess, so dass bei weitem nicht alle HPC-Anwendungen auch für GPGPU zur Verfügung stehen. Eine gewisse Rolle spielt auch die gegenseitige Abhängigkeit: Die Anwendungen werden erst portiert, wenn die Anwender sie auch nutzen. Die Anwender können sie aber nur nutzen, wenn sie auch zur Verfügung stehen. Eine Übersicht über portierte Software gibt es beispielsweise bei NVidia, die das als Argument für den Einsatz ihrer GPUs verstehen.

Programmierung

Für die Programmierung von GPGPU gab es mit CUDA zunächst ein Toolkit von NVidia, das die entsprechenden Werkzeuge zur Verfügung stellt. Die dort verwendeten Werkzeuge konzentrierten sich natürlich auf den Einsatz auf NVidia-Karten und ließen sich nicht für andere Hersteller verwenden.
Daraufhin entstand mit OpenCL ein offener Standard mit Implementierung, der für alle Arten von GPGPU infrage kommen soll. OpenCL soll dabei für jede Art von Host mit integriertem Co-Prozessor geeignet sein. Als Standard wurde es 2008 zum ersten Mal eingereicht und seither weiterentwickelt. AMD setzt beispielsweise bei seinen Karten auf diesen Standard.

Ausblick

Bei NVidia ist interessant, inwieweit die Kombination von GPGPU mit NVlink und Power-CPU von Software-Herstellern aufgegriffen wird und die Anwendungen dafür portiert werden. Wenn dies in nennenswertem Umfang passieren würde, entstünde eine ernsthafte Konkurrenz zur derzeitigen Vormachtstellung von Intel im HPC-Umfeld.
Intel sieht der Entwicklung nicht tatenlos zu, sondern hat, ausgehend von eigenen GPGPU-Entwicklungen unter dem Codenamen Larrabee, mit dem Xeon Phi inzwischen eine Many-Core-CPU entwickelt, die ähnliche Leistungswerte wie eine GPU hat. Das Versprechen bei Intel lautet, dass ein Xeon Phi im Wesentlichen wie eine normale Intel-Xeon-CPU zu programmieren ist, womit die Portierungsaufwände beim Einsatz von GPGPU von NVidia oder AMD wegfallen würden.
Momentan hat sich der Markt noch in keine von beiden Richtungen entschieden, man darf gespannt sein, was die nächsten Jahre hier bringen werden. (jbi)

Jan Wender ist Senior IT Consultant bei science+computing in Tübingen.

RSS Feed

Neuen Kommentar schreiben

Entdecken Sie die Printmagazine des WIN-Verlags