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