Kontakt aufnehmen

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.
 8 Stunden

Teilnehmerzahl


Preis je Teilnehmer (exkl. USt)

Erfahrungsberichte (3)

Kommende Kurse

Verwandte Kategorien