CUDA Ein Vortrag von Simon Bayer 1
1
CUDAEin Vortrag von Simon Bayer
2
Gliederung
Gliederung (Teil 1)1. Einleitung 2. CUDA C3. Parallelität
3.1. GPU ≠ CPU3.2. Parallelität bei CUDA3.3. Umwandlung von seriellem CPU-
Code in stark parallelen CUDA C-Code
3
Gliederung
3.3. Umwandlung von seriellem CPU- Code in stark parallelen CUDA C-Code
3.3.1. „embarrassingly parallel algorithms“3.3.2. Begriffsklärungen: Die verschiedenen Speicher3.3.3. Die Nutzung des Shared Memory 3.3.4. Vermeiden von Wettbewerbssituationen und
„__syncthreads()“3.3.5. Tiling / Blocking
4
Gliederung
4. API5. Beispiele
5.1. FindClosestPoint Brute Force5.2. Beschleunigung 15.3. Beschleunigung 2
5
Einführung
CUDA = Compute Unified Device Architecture• Schnittstelle von Nvidia für GPGPU seit Nov 06• Voraussetzung: hohe Parallelisierbarkeit• z.B. gegeben bei technischen Simulationen• bei Wirtschaftsvorhersagen• und vielem mehr
6
CUDA C
• CUDA C: erste Sprache speziell von GPU-Hersteller für GPGPU-Programmierung
• Sehr ähnlich zum Standard C=> einfachere Rezeption
• Lediglich ein paar notwendige Schlüsselwörter• Achtung: kein volles Standard C• Typische Struktur: Programm teils auf CPU,
teils auf GPU
7
CUDA C
• Hohe Datenparallelität => GPU• Serielle Teile => CPU Nutzen beider Stärken• Schlüsselwörter:_ _host_ _ _ _global_ _
_ _device_ _• Aufteilung auf der GPU: Blöcke und Threads
(Tafel)• Übergabe an Kernelfunktion in <<<…>>>
z.B. hostFunc<<<1,1>>>
8
CUDA C
• Blöcke beinhalten Warps, Warps beinhalten 32 Threads -> (Tafel)
• Entwicklung mit dem von Nvidia spezialisierten Eclipse Nsight unter openSUSE 12.2 -> gezeigt
9
Parallelität -> GPU ≠ CPU
• Computer haben CPUs mit ca. 2-12 Kernen und eine Taktung von meist mehreren GHz
=> hervorragend bei seriellem Code• ABER: Physikalische Grenze bei etwa 4GHz!• GPUs haben zwischen 8 und 480 Kernen und
eine Taktung von mehreren hundert MHz=> eher schlecht bei seriellem Code
=> dafür stark bei parallelisierbaren Algorithmen
10
Parallelität bei CUDA
• Zur Veranschaulichung: Pro Multiprozessor*16 Blöcke à 1024 Threads zuweisbar, bis zu 2^32-1 Blöcke insgesamt
=> Auf der eher preiswerten GT 440 etwa 67 Millionen Threads!
• Unterschied zw. GPU und CPU-Threads.
11
Parallelität bei CUDA: Organisierung
• Thread-IDs in Blöcken und Block-IDs im Gitter-> Tafel
• Performance-Unterschiede primär wegen unterschiedlicher Anzahl an Blöcken pro SM
• Die Restlichen Konfigurationen sind eher starr.
12
Umwandlung von seriell nach parallel
• Realistischer Fall: Algorithmus und serielle Variante vorhanden => beschleunigen
• „embarrassingly parallel algorithms“-> viele von einander unabhängige Iterationen-> Beispiel: Matrixmultiplikation-> nicht zwangsläufig einfach
• Stichwort SIMD - Datenparallelität
13
Wichtig: Speicherarten
14
Genauer: Shared Memory
• Effizientes Teilen von Inhalten innerhalb eines Thread-Blocks
• „Shared“ von geteilt -> einer pro Block• Essenziell für Tiling / Blocking (später)• Im L1-Cache -> ausgesprochen schnell• Local Memory und Shared Memory „teilen
sich“ dem L1 -> konfigurierbar
15
Race conditions vs _ _syncthreads()
__shared__ int I;
i = 0;
__syncthreads()
if(thread.Idx.x == 0) ++i;
__syncthreads()
if(thread.Idx.x ==1) ++i;
__global__ void SomeKernel () {
__shared__ int i;
i = thread.Idx.x;
}
_ _syncthreads() = seriellÞ Immer wenn nötig
Þ So wenig wie möglich
16
Tiling / Blocking
• Geschwindigkeit:• Shared Memory > Global Memory * 100 !!!
=> Block aus Global Memory laden und Elemente aus Block aus Shared Memory ansprechen
-> Tafel
17
API
• Schnittstelle zur Anwendungsprogrammierung• CUDA Runtime API => enge Korrespondenz zur
Hardware und nicht über Umwege* wie vorher
• Weitere „Utility“-Bibiotheken (CUDA Libraries) wie z.B. die CUDA Math API
18
Beispiel: FindClosest
• Veranschaulichung in 2D
Ergebnis hier:i[0] = 2i[1] = 2i[2] = 1
1
2
0
19
Beispiel: FindClosest
3D in Intuitivem Java-Code
(gezeigt)
20
Beispiel: FindClosest
CUDA: auch gezeigt und veranschaulicht
21
Quellen
Für diesen Vortrag:Bilder (beide bearbeitet):http://www.ng4a.com/wp-content/uploads/2013/05/nvidia-logo.jpghttp://www.hennek-homepage.de/video/CUDA-nvidia.jpgRest siehe Quellenverzeichnis
(http://cadoiz.square7.ch/CUDA/Quellen.pdf)
22
Vielen DankFür Eure Aufmerksamkeit