Schulungsübersicht
Einführung in das beschleunigte Rechnen mit GPUs
- Heterogenes Rechnen und die Architektur von CPU sowie GPU.
- Ausführung im CUDA-Umfeld samt Speicherkonzepten.
- Kompilieren von CUDA-C++-Code mittels nvcc und CMake.
- Überprüfung der GPU-Entwicklungsumgebung.
Parallele Algorithmen mit Thrust und CUB
- Geschwindigkeitssteigerung durch paralleles Sortieren, Reduzieren und Transformieren auf der GPU.
- Anpassung von STL-Algorithmen für die Ausführung auf GPUs.
- Nutzung von Thrust-Gerätevektoren sowie deren Ausführungsrichtlinien.
- Einsatz von CUB zur Bereitstellung spezialisierter paralleler Grundbausteine für eigene Anwendungen.
GPU-Speicherarchitektur und -verwaltung
- Globale, konstante sowie texturierte Speichertypen der GPU.
- Eindeutige Verteilung sowie Übertragung von Daten auf das Gerät.
- Nutzung des Unified Memory für einfachen Zugriff sowohl von CPU als auch GPU.
- Optimierung durch zielgerichtete Speichernutzungsstrategien und Ausführungsmuster.
Asynchrone Ausführung mittels CUDA-Streams
- Einrichtung sowie Verwaltung von CUDA-Streams.
- Überlappung von Kernel-Ausführungen mit Datentransfers zur Leistungssteigerung.
- Verwendung von CUDA-Events zur Synchronisation verschiedener Prozesse.
- Optimierung durch Anpassung der Stream-Prioritäten sowie parallele Ausführungsmöglichkeiten.
Eigene CUDA-Kernel schreiben
- Das SIMT-Programmiermodell und die daraus resultierende Warp-Ausführung verstehen.
- Korrekte Einstellungen bei der Kernel-Initialisierung sowie Anwendung von Grid-Strides in Schleifen.
- Lokale Indexierung von Threads sowie die Nutzung mehrdimensionaler Gittersysteme.
- Fachgerechte Fehlerbehandlung und Validierung mittels der CUDA-Runtime-API.
Thread-Hierarchie und Ausführungslogik
- Grundlagen von Grids, Blöcken sowie Threads innerhalb des Device-Codes.
- Nutzung spezieller Warp-Level-Operationen wie Ballot-Instruktionen zur synchronisierten Bearbeitung.
- Einsatz von Blockweisen Synchronisationselementen für präzise Zusammenarbeit der Prozesse.
- Analyse der GPU-Ressourcennutzung sowie Identifikation potenzieller Engpässe.
Kooperative Gruppen als Werkzeug flexibler Parallelität
- Einrichtung und Verwendung der cooperative_groups-API zur Definition unterschiedlichster Gruppierungen.
- Anordnung von Threads in spezifischen Blöcken sowie Nutzung des tiled_partition-Mechanismus.
- Ausführung komplexer Anwendungsfälle über mehrere Grid-Ebenen hinweg.
- Erstellung mehrstufiger Synchronisationsstrategien, um optimale Leistungswerte zu erzielen.
Tricks zur Optimierung mittels gemeinsamem Speicher
- Umgang mit Bankspeicherkonflikten durch gezielte Verteilung von Datenstrukturen.
- Effektive Aufteilungsstrategien für komplexe Matrixoperationen in mehreren Blöcken.
- Verwendung des gemeinsamen Speichers als kundengeführter Cache zur Performanzsteigerung.
- Nutzung von cuda::shared_memory_mdspan zur effizienten Darstellung mehrdimensionaler Datenstrukturen.
Kernel-Fusion sowie moderne parallele Entwurfsmuster
- Zusammenschließen mehrerer Kernel-Instruktionen zur Reduzierung von Startoverhead.
- Anwendung effizienter Algorithmen wie Scan, segmentierte Operationen sowie Schlüsselbasiertes Reduzieren.
- Gewinnung hoher Datenflussraten durch nutzungsgerechte atomare Anweisungen sowie verlaufsfreie Datenstrukturen.
- Einsatz von Warp-basierten atomaren Operatoren zur Entlastung des Hauptprozessors.
Profiling und Fehlerdiagnose mit Nsight Systems
- Auswertung der zeitlichen Abfolgen zwischen CPU- und GPU-Aktivitäten im Timeline-Format.
- Ermittlung kritischer Engpässe bei Speichertransfers sowie deren Ursachenforschung.
- Analyse der Kernel-Leistungswerte hinsichtlich Auslastung sowie optimaler Ressourcenverteilung.
- Stetige Optimierung mittels iterativer Arbeit mit Nsight Compute als Ergänzung zum Haupttool.
Moderne C++-Sprachmerkmale im Device-Code
- Sicherheit beim Einsatz von Lambda-Ausdrücken, constexpr-Funktionsdefinitionen sowie automatischer Variablentypbestimmung.
- Implementierung paralleler C++17-Algorithmentechniken unter Nutzung spezieller Ausführungsstrategien.
- Einsatz moderner Konzepte aus C++20 – darunter generische Typdefinitionen und Bereichsfunktionalitäten.
- Vollständige Nutzbarkeit der aktuellen C++23-Standards bei Kompilation durch nvcc sowie im CCCL 3.x-Umfeld.
CUDA-Graphen und erweiterte asynchrone Funktionen
- Ausarbeitung sowie Ausführungssteuerung von CUDA-Graphiken als dynamische Programmlogikketten.
- Durchführung einer automatischen Erfassung bestehender Parallelverläufe in Form solcher Graphiken.
- Erstellung individueller Änderungs- und Bedingungsknoten für kontinuierliche Entwicklungsumgebungen.
- Reduzierung des Startoverheads bei sich häufig wiederholenden Verarbeitungsschritten in großen Datenmengen.
Integration vorhandener Anwendungen mit GPU-Unterstützung
- Aufbau funktionaler Schnittstellen zwischen klassischem C++-Code sowie ergänzenden GPU-Funktionsblöcken.
- Nutzung mehrerer GPUs sowie Einbindung in NUMA-Systemstrukturen zur Ressourcenoptimierung.
- Vollständige Einbindung von CUDA-Aufrufen in bestehende Build-Umgebungen mittels CMake-Technik.
- Praktische Debugging-Methoden auf Systemebene durch Verwendung des Tools cuda-gdb als Hilfsmittel.
Zusammenfassung und bewährte Vorgehensweisen im CUDA-Umfeld
- Auswahl geeigneter Implementierungsansätze zwischen Thrust, CUB sowie individuell entworfenen Kerneln.
- Evaluierung der Portabilität von Codefragmenten hinsichtlich zukünftiger GPU-Plattformwechsel.
- Strukturgebung im Code durch klare Organisation und RAII-Prinzipien zur effizienten Ressourcenverwaltung.
- Erarbeitung konkreter Zielvorstellungen sowie sinnvoller Fortbildungswege für künftige Spezialisierungen auf CUDA-Ebene.
Voraussetzungen
- Grundsätzliche Kenntnisse in C++, insbesondere Lambda-Ausdrücke, Templates sowie der STL.
- Vertrautheit mit gängigen Algorithmen, Containern und Iteratoren aus der Standardbibliothek.
- Sicherheit im Umgang mit Schleifen, Bedingungen sowie Funktionen.
- Vorkenntnisse in CUDA oder GPU-Programmierung sind nicht erforderlich.
Zielgruppe
- C++-Entwickler, die rechenintensive Anwendungen mit GPUs beschleunigen möchten.
- Software-Ingenieure, die von rein CPU-basierten auf heterogene parallele Umgebungen umsteigen wollen.
- Performance-Ingenieure sowie quantitative Entwickler, die mit großen Datensätzen arbeiten.
Erfahrungsberichte (3)
Anfangs wirkte das Tempo des Trainers für mich etwas zu schnell, aber nachdem ich während der Schulung entsprechendes Feedback gegeben hatte, erkannte er dies an und reduzierte das Tempo, ohne dabei an der Qualität der Vorträge zu verlieren. Er baute eine gute Beziehung zum Publikum auf, war sehr freundlich und offen für Diskussionen.
Alexandru Ostafi - Siemens
Kurs - Advanced C++ : Practical workshop
Maschinelle Übersetzung
Detaillierte Erklärungen und subtile Wiederholungen der Punkte, die das Wissen wirklich nachhaltig verankert haben. Rods Bereitschaft, auch selten gestellte Fragen zu überprüfen, um sicherzustellen, dass seine Antworten 100% korrekt waren. Ebenso sein Interesse daran, die Vor- und Nachteile alternativer Programmierstile zu diskutieren, sodass wir nicht nur lernten, wie man C++ in der beabsichtigten Weise verwendet, sondern auch, warum es so gemacht werden sollte.
Nick Dillon - cellxica Ltd
Kurs - Using C++ in Embedded Systems - Applying C++11/C++14
Maschinelle Übersetzung
Erfahrungstechnik, es ist das Wissen und die wertvollen Kenntnisse des Lehrers.
Carey Fan - Logitech
Kurs - C/C++ Secure Coding
Maschinelle Übersetzung