geforce fx 5950 ultra
Transcription
geforce fx 5950 ultra
Universität Karlsruhe (TH) Forschungsuniversität · gegründet 1825 Software Engineering für moderne, parallele Plattformen 9. GPGPUs: Grafikkarten als Parallelrechner Dr. Victor Pankratius Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto Fakultät für Informatik Lehrstuhl für Programmiersysteme Agenda • GPGPU - Erläuterung • Motivation • Performanzaspekte • Beispiele: NVidia GeForce • Das CUDA-Programmiermodell • Organisation und Speichermodell • Ausgewählte Sprachkonstrukte (V 2, Fokus auf allgemeine Programmierung, keine Grafik) • Ausblick Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 2 GPGPU – Was ist das? • GPGPU • engl. Abkürzung für „General purpose computation on Graphics Processor Units (GPUs)“ • Idee: Nutzung von Grafikkarten als allgemeine Parallelrechner Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 3 Motivation Performanz bei Gleitkommaberechnungen Peak GFLOP/s GT200: GeForce GTX 280 G92: GeForce 9800 GTX 1000 GT200 G80: GeForce 8800 GTX G71: GeForce 7900 GTX G70: GeForce 7800 GTX G80 Ultra 750 G92 NV40: GeForce 6800 Ultra NV35: GeForce FX 5950 Ultra NV30: GeForce FX 5800 G80 500 G71 G70 250 NV35 NV40 3GHz Intel Core2 Duo NV30 3.2GHz Harpertown Quelle: NVidia, Juni 2008 0 Jan Jun 2003 Apr Jun 2004 Fakultät für Informatik Lehrstuhl für Programmiersysteme Mar Nov Mai 2005 2006 2007 Jun 2008 Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 4 Gründe für Gleitkomma-Performanz Spezialisierung GPU vs. CPU KontrollLogik ALU ALU ALU ALU Cache • CPU geeignet für allgemeine Anwendungen DRAM • GPU gut geeignet für spezielle Anwendungen • mit großen Datenmengen, Datenparallelität, SIMD- Arbeitsweise Æ daher weniger komplexe Kontrollflusslogik nötig DRAM • mit großem Verhältnis Æ Latenzzeiten bei Zugriff auf Hauptspeicher werden durch viele Berechnungen, weniger durch Cache-Effekte amortisiert Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 5 Beispiel - Nvidia GeForce 8 Graphics Processing Unit (GPU) Prozessor, je nach Modell ~450-600MHz, 32-Bit FPU,1024 Register ~16 KB ~86,4 GB/s 128 Prozessoren insgesamt, jeder mit 96 Fäden in Hardware Insgesamt 12288 HW-Fäden! DRAM-Speicher auf Grafikkarte insg: ~640-768 MB Neuere Entwicklung: GTX280 mit: 240 Prozessoren, 1GB RAM Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 6 Wieso hat man bis jetzt nicht Grafikkarten als „Parallelrechner“ benutzt? • Programmiermodelle waren traditionell speziell auf Grafikverarbeitung ausgerichtet • Eingeschränkter Befehlssatz • Hardware-Nähe bei Programmierung • Allgemeine Programmierung der Grafikkarte eher Ausnahmefall • Verbesserungen in den letzten Jahren bei Grafikkarten • Mehr parallel arbeitende Einheiten • Mehr Speicher • höhere Bandbreite bei Hauptspeicherzugriff • Neue Trends: • Programmiermodelle werden erweitert und verallgemeinert • Standard-PCs haben leistungsfähige Grafikkarten Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 7 Das CUDA-Programmiermodell • CUDA: „Compute Unified Device Architecture“ • Von NVidia entwickelt • Beinhaltet allgemeines Programmiermodell für Grafikkarten • Momentan realisiert als Erweiterung der Programmiersprache C durch zusätzliche Sprachkonstrukte • Grafikkarte wird als Co-Prozessor für datenparallele Verarbeitung verwendet • Entwickler schreibt Programm, das datenparallele Teile auf der Grafikkarte (GPU) und den Rest auf dem Prozessor (CPU) ausgeführt Integrierter CPU+GPU Quelltext Nvidia C Compiler GPU CPU Assembly Quelltext CUDA Standard C Treiber Compiler GPU CPU • Sprachkonstrukte kennzeichnen entsprechende Teile Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 8 Das CUDA-Programmiermodell • Unterschiede zw. Fäden auf GPU vs. CPU • Fäden auf GPU leichtgewichtig, wenig Mehraufwand bei Erstellung • GPU braucht eine große Zahl von Fäden (tausende!), um effizient zu arbeiten • Empfehlung für GeForce 8: Etwa 5000 (!) Fäden • Multicore-CPUs dagegen nur wenige Fäden • Datenparallele Teile eines Programms werden auf der GPU als sog. Kernroutinen (engl. „Kernels“) ausgeführt Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 9 Das CUDA-Programmiermodell Organisation von Fäden (1) Wirtsrechner • Ein Kern wird mit Hilfe eines GPU (Host) Gitters aus Faden-Blöcken ausgeführt Gitter 1 Kern 1 Block (0, 0) Block (1, 0) Block (2, 0) Block (0, 1) Block (1, 1) Block (2, 1) Gitter 2 (limitierten) Anzahl mehrerer Fäden, die miteinander kooperieren können • Datenaustausch durch Zugriff auf Block (1, 1) Faden Faden Faden Faden Faden (0, 0) (1, 0) (2, 0) (3, 0) (4, 0) Faden Faden Faden Faden Faden (0, 1) (1, 1) (2, 1) (3, 1) (4, 1) Faden Faden Faden Faden Faden (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) Lehrstuhl für Programmiersysteme gleich • Ein Faden-Block besteht aus einer Kern 2 Fakultät für Informatik • Dimensionen und Größe der Blöcke schnellen gemeinsamen Speicher • Fäden innerhalb eines Blocks können ihre Zugriffe synchronisieren • Fäden aus verschiedenen Blöcken können nicht miteinander kooperieren Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 10 Das CUDA-Programmiermodell Organisation von Fäden (2) Wirtsrechner • Fäden und Blöcke haben IDs GPU (Host) Gitter 1 Kern 1 • Zur Vereinfachung der Adressierung: Block (0, 0) Block (1, 0) Block (2, 0) Block (0, 1) Block (1, 1) Block (2, 1) Zählung in verschiedenen Dimensionen möglich • Block: 1D, 2D • Faden: 1D, 2D, 3D Gitter 2 Kern 2 • Beispiel GeForce 8800 Block (1, 1) • Max. Fäden/Block: 512 Faden Faden Faden Faden Faden (0, 0) (1, 0) (2, 0) (3, 0) (4, 0) • Max. Länge einer Dimension: 65535 Faden Faden Faden Faden Faden (0, 1) (1, 1) (2, 1) (3, 1) (4, 1) Faden Faden Faden Faden Faden (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 11 Das CUDA-Programmiermodell Speichermodell (1) Gitter Block (0, 0) Logische Sicht: • Jeder Faden kann folgende Zugriffe durchführen Block (1, 0) Gemeinsamer Speicher • Faden-Register: Gemeinsamer Speicher Register Register Register Register Faden (0, 0) Faden (1, 0) Faden (0, 0) Faden (1, 0) • • • Lokaler Speicher Lokaler Speicher Lokaler Speicher Globaler Speicher Lokaler Speicher • Wirtsrechner (Host) Speicher mit konstanten Daten (Initialisierung durch Host) TexturSpeicher Fakultät für Informatik Lehrstuhl für Programmiersysteme • Lesen+schreiben Faden-lokaler Speicher: Lesen+schreiben Gemeinsamer Speicher im Block: Lesen+schreiben Globaler Speicher im Gitter: Lesen+schreiben Speicher mit konstanten Daten im Gitter: Nur lesen Textur-Speicher im Gitter: Nur lesen • Wirtsrechner kann auf globalen, konstanten und Textur-Speicher lesend und schreibend zugreifen • Dadurch Kommunikation zw. Wirtsrechner und GPU Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 12 Das CUDA-Programmiermodell Speichermodell (2) Gitter Block (0, 0) Gemeinsamer Speicher Register • cudaMalloc() Block (1, 0) Register • Alloziert Speicher im globalen Speicherbereich Gemeinsamer Speicher Register • Benötigt zwei Parameter: Register • Adresse eines Zeigers zu Faden (0, 0) Faden (1, 0) Faden (0, 0) Faden (1, 0) Lokaler Speicher Lokaler Speicher Lokaler Speicher Lokaler Speicher Globaler Speicher Speicher mit konstanten Daten (Initialisierung durch Host) Anfang der allozierten Daten • Größe der Daten Wirtsrechner (Host) • cudaFree() • Gibt Speicher wieder frei • Benötigt Zeiger TexturSpeicher Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 13 Das CUDA-Programmiermodell Speichermodell (3) Gitter Block (0, 0) • cudaMemcpy() Block (1, 0) • Speicher-Datentransfer Gemeinsamer Speicher Register Register Gemeinsamer Speicher Register • Benötigt vier Parameter • Zeiger auf Quelle, Ziel Register • Anzahl zu kopierender Bytes Faden (0, 0) Faden (1, 0) Faden (0, 0) Faden (1, 0) • Art des Transfers • Host nach Host Lokaler Speicher Lokaler Speicher Lokaler Speicher Lokaler Speicher • Host nach GPU • GPU nach Host Globaler Speicher Speicher mit konstanten Daten (Initialisierung durch Host) Wirtsrechner (Host) • GPU nach GPU • In CUDA 1.0 asynchron TexturSpeicher Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 14 Das CUDA-Programmiermodell Speichermodell (4) Grafikkarte • Physische Sicht • Globaler Speicher, Speicher für konstante Daten und TexturSpeicher sind lediglich Regionen im RAMSpeicher der Grafikkarte Prozessorgruppe N Prozessorgruppe 2 Prozessorgruppe 1 Gemeinsamer Speicher Register Prozessor 1 Register Prozessor 2 Register … Instruktionseinheit Prozessor M Cache für konstante Daten TexturCache Fakultät für Informatik Lehrstuhl für Programmiersysteme RAM-Speicher auf Grafikkarte - Gobaler Speicher (hat keinen Cache!) - Speicher mit konstanten Daten Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto - Texturspeicher 15 Das CUDA-Programmiermodell Spracherweiterungen (1) - Variablen Erweiterungen für Variablendeklarationen Ablageort Sichtbarkeit Lebensdauer __device__ __local__ int localVar; Lokaler Speicher Faden Faden __device__ __shared__ int sharedVar; Gemeinsamer Block Block Globaler Speicher Gitter Applikation Speicher mit konstanten Daten Gitter Applikation Speicher __device__ int globVar; __device__ __constant__ int constVar; „auf GPU“ Zeiger sind nur auf globalen Speicher erlaubt. Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 16 Das CUDA-Programmiermodell Spracherweiterungen (2) - Funktionen Erweiterungen für Funktionsdeklarationen Nur ausführbar auf Nur aufrufbar auf __device__ float gpuFunction() GPU GPU GPU Wirtsrechner Wirtsrechner __global__ void __host__ • device kernelFunction() float hostFunction() Wirtsrechner und global-Funktionen unterstützen keine • Rekursion • Deklaration statischer Variablen innerhalb der Funktion • Variable Anzahl an Argumenten Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 17 Das CUDA-Programmiermodell Spracherweiterungen (3) • Eine Funktion, die auf der GPU ausgeführt werden soll, erhält eine Ausführungskonfiguration __global__ void kernelFunktion(params); //Aufruf kernelFunktion<<<GitterDim, BlockDim, BytesSharedMem>>>(params) Anzahl Blöcke im Gitter Anzahl Fäden in einem Block Die Konfigurationsparameter der Ausführungskonfiguration werden vor den Funktionsparametern evaluiert. Alle Parameter werden der GPU über den gemeinsamen Speicher übergeben. Fakultät für Informatik Lehrstuhl für Programmiersysteme Größe des gemeinsamen Speichers, der dynamisch pro Block alloziert werden soll Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 18 Das CUDA-Programmiermodell Spracherweiterungen (4) • Atomare Operationen • atomicAdd(), Sub, Min, Max, Inc, Dec • atomicAnd(), Or, Xor • atomicExch(), atomicCAS() //nur für globalen Speicher • Synchronisation • void __synchthreads(); • Ist Barriere, die (nur) für alle Fäden in einem Block gilt • Sonst keine weiteren Synchronisationskonstrukte Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 19 Das CUDA-Programmiermodell Spracherweiterungen (5) • Abfrage von IDs • threadIdx • Variable enthält den Index eines Fadens innerhalb eines Blocks • blockIdx • Variable enthält Index eines Blocks innerhalb eines Gitters • blockDim • Abfrage der Dimensionen eines Blocks (z.B. blockDim.x) Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 20 Das CUDA-Programmiermodell Beispiel: Vektoraddition (1/2) Ausführung auf GPU //Berechne elementweise C = A + B //jeder Faden führt Addition aus //Aufruf von Wirtsrechner, Ausführung auf GPU __global__ void vecAdd(float* A, float* B, float* C) { int i = threadIdx.x + blockDim.x * blockIdx.x; Index eines Fadens #Fäden/Block Index eines Blocks C[i] = A[i] + B[i]; } Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 21 Das CUDA-Programmiermodell Beispiel: Vektoraddition (2/2) int main() { Ausführung auf Wirtsrechner (Host) ... //alloziere & initialisiere Speicher für A, B auf Host float *h_A=...; *h_B=...; //alloziere float *d_A, cudaMalloc( cudaMalloc( cudaMalloc( Speicher für A, B, C auf GPU *d_B, *d, C; (void**) &d_A, N*sizeof(float)); (void**) &d_B, N*sizeof(float)); (void**) &d_C, N*sizeof(float)); //kopiere Inhalte von Host auf GPU cudaMemcpy( d_A, h_A, N*sizeof(float), cudaMemcpyHostToDevice) ); cudaMemcpy( d_B, h_B, N*sizeof(float), cudaMemcpyHostToDevice) ); //Vektoraddition für Vektorlänge N, mit N/256 Blöcken //und mit je 256 Fäden pro Block vecAdd<<<N/256, 256>>>(d_A, d_B, d_C); Fakultät für Informatik } Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 22 Anmerkungen • CUDA-Konzept im Hinblick auf allgemeine Programmierung an vielen Stellen noch verbesserbar bzw. erweiterbar (z.B. bessere Transparenz der Speicherzugriffe, Parallelisierungskonstrukte auf höherer Abstraktionsebene, …) • Vorgehen bei Fehlersuche • CUDA-Übersetzer in Emulationsmodus versetzen • Hardware + Fäden werden komplett auf CPU (sequenziell) emuliert Æ Nutzung von Konsolenausgabe, setzen von Haltepunkten, usw. dann möglich • FPUs halten sich bei Gleitkommaberechnungen nicht an den gängigen IEEE-Standard • Numerische Ergebnisse können abweichen Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 23 Ausblick • Weitere Co-Prozessor-Ansätze • Beispiel: Clearspeed Advance e710 • Erweiterungskarte für PC • ~96 GFLOPS • 2GB RAM • Bandbreiten: 192 GB/s zum internen Speicher, 8GB/s zum Rechner-Hauptspeicher • 32 + 64 Bit Genauigkeit • Konform zu IEEE-Gleitkomma-Standard Fakultät für Informatik Lehrstuhl für Programmiersysteme Prof. Walter F. Tichy, Dr. Victor Pankratius, Dipl.-Inform. Frank Otto 24