Wissenschaftliches Programmieren mit CUDA Christian Renneke Daniel Klimeck Betreuer: Dipl.-Ing. Bastian Bandlow
Leitfaden Motivation Was ist CUDA ? NVIDIA Grafikkarte Programmierung FIT im Zeitbereich Ergebnisse Projektverlauf Zusammenfassung
Motivation Beschleunigung von Simulationen mit Hilfe von Grafikkartenprozessoren (GPU) Ausnutzung der massiven Parallelität Zeitbereichsintegration in finiter Integration (FIT) Ähnlich dem Updateschema aus Finite Differenzen im Zeitbereich
Was ist CUDA ? Compute Unified Device Architecture ( CUDA ) Entwickelt von NVIDIA Ermöglicht die Benutzung des Grafikprozessors zur Beschleunigung wissenschaftlicher und technischer Berechnungen Standard-C-Entwicklungsumgebung Anwendungsbeispiele: Numerik Grafik Signalverarbeitung Wissenschaft
Vergleich GPU v. CPU Hardware-Modell Caches beschreiben. Daten raussuchen! Quelle: NVIDIA CUDA Programming Guide
Vergleich GPU v. CPU NVIDIA GeForce GTX 260 Stream-Prozessoren: 192 24 Multiprozessoren, mit je 8 Kernen Core-Taktfrequenz : 576 MHz Speicher-Taktfrequenz: 999 MHz Speicher : 896MB Unterstützt Datentyp DOUBLE 1,4 Mrd. Transistoren Vergleich: Intel Core i7 (11/2008) 731 Millionen Transistoren Core i7 (Bloomfield) [Bearbeiten] Einführungstermin: 17. November 2008 Taktfrequenz(en): 2,67 GHz (Core i7 920), 2,93 GHz (Core i7 940), 3,2 GHz (Core i7-965 EE) Kerne 4 Cache: L1 je Kern 32 KByte 8-fach assoziativ, L2 256 KB, L3 8 MB Die-Größe: 275 mm² Datenbus: 64 Bit Adressbus: 36 Bit Transistoren/Fertigungstechnik: 731 Millionen bei 45 nm Adressierbarer Speicher: 64 GB Quelle: http://img2.abload.de/img/gtx260_01ytg.jpg
Programmierung Host Application Aus C: CublasDdot() CUDA Libraries .cu Datei, mit selbstgeschriebenen Kernel auf „Runtime“Abstraktion CUDA Runtime .cu Datei, mit voller Kontrolle, aber alles „von Hand“ CUDA Driver Quelle: NVIDIA CUDA Programming Guide Device
Kernel0<<< x ,y >>>() Programmierung C Program Sequential Execution Serial code Parallel kernel Kernel0<<< x ,y >>>() Quelle: NVIDIA CUDA Programming Guide Host „Daten draufkopieren“ Device Grid 0 Host „Daten / Ergebnisse runterkopieren“
FIT im Zeitbereich Untersuchung der Leistungsfähigkeit von CUDA Ausführen einer Simulation mit Unterstützung der GPU Hier: Berechnung der Ströme und Spannungen in einem Koaxialleiter. Anregung: Konzentrierte Bauelemente an der Stirnseite. Gausspuls als Anregung. Berechnung der E- und H-Felder zu nt Zeitschritten mittels Leapfrog-Algorithmus Elektr. Randbedingung Innenleiter Inhomogen gefüllter Koaxialleiter Quelle: Übung zu Elektromagnetischen Feldsimulation, Projekt 7
FIT im Zeitbereich Leapfrog-Algorithmus Umsetzung im Quellcode: Schleife zum Durchlaufen der Zeitschritte. Statt der seriellen Berechnung der Felder an jedem Gitterpunkt Übergabe an die parallel arbeitende GPU
FIT im Zeitbereich Curlmatrix Nu*Nv Nu 1 Muss nicht mit übergeben werden, sondern ergibt sich aus der Struktur: Multiplikation des E-Vektors mit der Curl-Matrix resultiert in 4 Multiplikationen mit +-1, alle anderen einträge Null. Sicherstellen der Korrekten zugriffe auf E,H Quelle: Vorlesungsskript zu Elekromagnetische Feldsimulation
Programmierung Leapfrog Algorithmus Beispiel: H-Update umgesetzt in C-Code
„Implementierung der Curl-Matrix“ Programmierung Leapfrog Algorithmus Beispiel: H-Update als Kernel-Funktion „Implementierung der Curl-Matrix“
Programmierung Leapfrog Algorithmus Aufruf der Kernel-Funktion Berechnung der aktuellen Hx-Komponente, aus der alten, zwei Ex- und zwei Ez-Komponenten.
Laufzeitergebnisse in sec Struktur 1: Inhomogener Koaxialleiter Anregung: E- /H-Feld einer TEM-Welle Anzahl Laufzeitergebnisse in sec Gitterpunkte Zeitschritte Matlab Mex-C CUDA 2.416 1.200 1,8 0,7 1,1
Laufzeitergebnisse in sec Struktur 2: Bragg Reflektor 4 Schichten Laufzeitergebnisse in sec CUDA 9,4 Mex-C - seriell 95,7 Mex-C - openmp(4) 53,1 Anzahl Gitterpunkte Zeitschritte 76.874 10.000
Laufzeitergebnisse in sec Struktur 3: Bragg Reflektor 20 Schichten Laufzeitergebnisse in sec CUDA 93 Mex-C - seriell 1456 Mex-C - openmp(4) 696 Anzahl Gitterpunkte Zeitschritte 173.978 57.000
Laufzeitergebnisse in sec Struktur 4: Bragg Reflektor 35 Schichten Laufzeitergebnisse in sec CUDA 568 Mex-C - seriell 8991 Mex-C - openmp(4) 4853 Anzahl Gitterpunkte Zeitschritte 693.825 99.004
Gitterpunkte * Zeitschritte Ergebnisse Vergleich der Methoden 15x 8x Gitterpunkte * Zeitschritte CUDA MEX-C seriell MEX-C openmp(4) 768.740.000 9,4 96 53 9.916.746.000 93 1456 696 68.691.450.300 568 8991 4853
Ergebnisse im Vergleich S-Parameter Bragg Reflektor (20 Schichten, Struktur 3)
Ergebnisse im Vergleich Zeitsignale
Projektverlauf (1) Einarbeitung und Inbetriebnahme des Systems Implementierung des Leapfrog – Algorithmus: in einzelnen Funktionen unter MEX-C in einer Funktion unter MEX-C Testprogramms auf der GPU Kleines Beispiel in CUDA Implementierung des Leapfrog – Algorithmus auf der GPU Zeitupdate-Schema in CUDA
Projektverlauf (2) Simulation und Aufnahme der Laufzeitergebnisse von verschiedenen Leapfrog – Varianten Bewertung der Effizienz von CUDA Dokumentation Bewertung der Effizienz von CUDA Anhand eines genügend großen beispiels Fehler??? Genauigkeit?
Zusammenfassung Programmieren mit CUDA lohnt sich ab einer gewissen Komplexität des Problems Debuggen ist umständlich CUDA reduziert wesentlich die Berechnungszeit Keine Genauigkeitsverluste Geringe Kosten der Grafikkarte SDK kostenfrei erhältlich
Vielen Dank für Ihre Aufmerksamkeit!