GPGPU Computing lernen

freek0055

Ensign
🎅Rätsel-Elite ’24
Registriert
März 2007
Beiträge
252
Hallo liebe Community,

Ich beginne bald ein Informatikstudium und wollte mir auch noch ein eigenes Themengebiet aus persönlichem Interesse anschauen. Und zwar will ich das Thema GPGPU Computing näher beleuchten, da ich hier sehr viel Potenzial für die Zukunft sehe. Nun wollte ich euch einmal fragen, ob ihr mir hierfür ein gutes Buch empfehlen könnt, darf auch gerne auf Englisch sein, obwohl ich Deutsch natürlich vorziehen würde.

Eine weitere Frage wäre, ob man hier eher das Thema CUDA oder OpenCL beleuchten soll (gibt es noch weitere bedeutende Bereiche?).

Wie ihr schon seht, bin ich auf dem Thema GPGPU noch blutiger Anfänger und wäre für eure Tipps echt dankbar :)
 
Ich habe wohl genausoviel Ahnung wie Du von dem Thema, und wenn du CUDA und OpenCL beleuchtest, hättest du mehr Ahnung von beidem, könntest anderen von den Vor- und Nachteilen erzählen, und Dich selbst möglicherweise auf eine Sache spezialisieren.

Aber mal anders gefragt, was hast du überhaupt für Programmiererfahrungen?
 
Hi,

also diesen Sommer habe ich meine Berufsausbildung als Fachinformatiker Anwendungsentwicklung abgeschlossen und in der Ausbildung konnte ich bereits Erfahrungen mit .Net und SQL sammeln. Außerdem habe ich einige Schulungen in C/C++ hinter mir und die Basics sind mir da auch bekannt.

Meine Frage mag durchaus ein bisschen blauäugig erscheinen, aber ich dachte irgendwo muss man ja mal anfangen.
 
Zuletzt bearbeitet: (Rechtschreibung ...)
Ich glaub es ist sinnvoller, wenn du erstmal die normalen Sprachen weitgehend beherrschst, um dann den "Übergang" zum GPU Computing aufbauen zu können. Prinzipiell sind alle Aufgaben, die mit GPU Computing bewältigt werden können auch mit normaler CPU Berechnung umsetzbar. Wenn du also erstmal das Grundsätzliche Feld beherrschst, kannst du versuchen das selbe mit GPU Computing umzusetzen. Außerdem hast du dann ein besseres Verständnis für den Syntax.

Ganz wichtig. Nicht alle Berechnungen die "per CPU" gehen funktionieren auch "per GPU". Dafür können die Aufgabenfelder die "per GPU" möglich sind, wesentlich effizienter berechnet werden.
 
Die diversen Guides die mit dem NVIDIA SDK mitkommen sind ganz gut
Für OpenCL sind es diese, welche sich im Gegensatz zur OpenCL Standardliteratur direkt mit den GPGPU eigenschaften beschäftigen:
https://www.computerbase.de/forum/t...els-xeon-phi-mic.1092648/page-3#post-12516894
Selbst wenn sich die Guides auf Nvidia beziehen, so gilt das ganze grösstenteils analog für AMD.

Die Unterschiede zwischen OpenCL und Cuda sind relativ minimal; die Prinzipien nahezuidentisch. Afaik ist der OpenCL Treiber von NVidia auch nur grösstenteils ein Wrapper um ihren Cuda Treiber herum. Beherrscht man das eine, vor allem die Prinzipien, auf denen es aufbaut, so kann man mit minimalen Aufwand das andere lernen.

Hauptvorteil von OpenCL wäre dass es prinzipiell auf allen möglichen laufen sollte. Praktisch sind jedoch diverse Anpassungen nötig, da jeder OpenCL Treiber so seine eigene Interpretation vom OpenCL Standard hat und jedes OpenCL Gerät ausserdem andere Hardwarelimitierungen, wie zB wie viele Threads gleichzeitig ablaufen können oder wieviele Texturen ein Programm maximal haben darf, diverse optinale Funktionalitäten und Erweiterungen hat. Auch hat GPGPU sehr viele Performance Fettnäpfchen hat, so dass man den Code wohl noch je GPU bzw CPU anpassen muss.
Auch sind die OpenCL Implementierungen wie die meisten Implementierungen der Khronos APIs meist sehr bugverseucht und zusätzlich ist die openCL Schnittstelle ebenfalls wie jede andere Khronos Schnittstelle schlecht designt. Alleine die Tatsache, dass man in OpenCL 1.1. die Argumente eines Kernels nur per Index und nicht per Namen setzen kann ist soo fehleranfällig und regt mich sooo auf. . . . .
Zudem ist OpenCL weiter verbreitet als Cuda, da es offen ist. Gerade an den Unis machen deshalb die meisten Leute etwas mit OpenCL.



Cuda hat den Vorteil, dass es proprietär ist. Jede NVidia Karte gehört einer Cuda Version an und hat dadurch feste Spezifikationen und Hardwarelimitierungen was einem das Programmieren für unterschiedliche Karten erleichtert. Wegen dieser Properietät ist es ebenfalls wesentlich besser designt als OpenCL. So muss man zB den Kernel Quellcode nicht umständlich per String an den Compiler übergeben, sondern kann ihn direkt in den Quellcode seines Hauptprogramms schreiben. Beim Compilieren des Hauptprogramms zieht dann ein Präprozessor(?) für Cuda sämtliche Kernels heraus. Dies vereinfacht, wie ich finde, das Programmieren ziemlich.
Wie weit Cuda selbst bugverseucht ist kann ich leider nicht beurteilen, da ich es noch nicht selbst verwendet habe.
Ausserdem soll laut diversen Quellen unter bestimmten Voraussetzungen Cuda schneller sein als OpenCL.


Als weitere Alternativen gebe es noch:
Direct Compute, GPGPU auf Windows beschränkt dafür propertiär
Compute Shader in OGL 4.3; mehr oder weniger das selbe wie OCL mit besserer OpenGL Anbindung und ist eher für graphische Berechnungen geeignet.
Die Grundkonzepte sind allerdings auch bei diesen beiden APIs das selbe.

P.S: Wo studierst du denn Info ? :)
 
Zuletzt bearbeitet:
@MrChiLLouT:
Mir ist durchaus bewusst, das dies ein sehr spezielles Themengebiet ist und ich sicher noch kein allumfassendes bei den "gängigen" Programmiersprachen besitze (Apropos, was ist darunter deiner Meinung nach genau einzuordnen?) Ich habe das Thema auch schon kurz angeschnitten, und mir ist auch klar, das die CPU generell auch "alles" kann. Aber wie so oft ist eben Zeit = Geld. Auch ist mir klar, dass auch wenn es auf der GPU läuft, dies nicht immer schneller/sinnvoller ist. Die zu verarbeitenden Daten müssen ja erst einmal über den PCIe Bus in den VRAM gespeichert werden, verarbeitet werden und ggf. wieder in den normalen RAM geschrieben werden.

@Nai
Danke dir schon mal für deine Antwort. Du scheinst ja schon einiges in diesem Bereich gemacht zu haben. Hast du dir das alles mit Hilfe der Online Dokumentationen beigebracht, oder dir dazu ein Buch besorgt? Ich lerne nämlich um einiges lieber aus einem richtigen Buch ;)
Ansonsten ist das mit der SDK schon mal ein guter Tipp.


Ich beginne dieses Wintersemester an der FH Regensburg mein Studium. Uni darf ich leider nicht, habe nur ein Fachabi ;)
 
Ich hatte zur Beginn komplett andere Voraussetzungen als du im Moment hast, denn ich hatte bereits Erfahrungen bis OpenGL 4.x und habe mit der Shadersprache von OpenGL schon einmal ein bisschen GPGPU programmiert. Deshalb waren mir teile der Grundlagen davon mehr oder weniger schon bekannt. Ich habe mich angefangen in OpenCL dann mit dem Addisson Wesleys OpenCL Programming Guide einzuarbeiten, aber nach den ersten ~10 Seiten habe ich das Buch zur seite gelegt, da es die meiste Zeit nichts mit GPGPU im speziellen zu tun hatte und mir deshalb nichts gebracht hat, und bin auf diese Guides umgestiegen. Diese waren zumindest für mich ausreichend um die Grundlagen zu verstehen. Wegen diesen unterschiedlichen Voraussetzungen, fällt mir es etwas schwer zu beurteilen in wie weit dir dieses Buch etwas bringen könnte, mir zumindest hat es nicht gefallen.
Mein weiteres Vorgehen, was ich an denier Stelle zumindest zuerst versuchen würde, wäre folgendes:
Zuerst in ein paar online "Hello World" OpenCL Tutorials reinschauen die nachvollziehen und die Standardobjekte und fundamentalen Grundlagen kennen lernen. Die evtl mal selbst zu implementieren und daran etwas "herumspielen".
Dann diese diversen Hardwarenahen Guides durchlesen. Denn GPGPU hat diverse PerformanceRisiken und Konzepte, welche einem von diesen Guides besser erläutert werden, eben weil sie hardwarenäher sind.
 
Zurück
Oben