Präsentation herunterladen
1
Ein Vortrag von Simon Bayer
CUDA Ein Vortrag von Simon Bayer
2
Gliederung Gliederung (Teil 1) 1. Einleitung 2. CUDA C 3. Parallelität 3.1. GPU ≠ CPU 3.2. Parallelität bei CUDA 3.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 „embarrassingly parallel algorithms“ Begriffsklärungen: Die verschiedenen Speicher Die Nutzung des Shared Memory Vermeiden von Wettbewerbssituationen und „__syncthreads()“ Tiling / Blocking
4
Gliederung 4. API 5. Beispiele 5.1. FindClosestPoint Brute Force 5.2. Beschleunigung 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 > gezeigt
9
Parallelität -> GPU ≠ CPU
Computer haben CPUs mit ca 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()
__global__ void SomeKernel () { __shared__ int i; i = thread.Idx.x; } __shared__ int I; i = 0; __syncthreads() if(thread.Idx.x == 0) ++i; if(thread.Idx.x ==1) ++i; _ _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] = 2 i[1] = 2 i[2] = 1 1 2
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): Rest siehe Quellenverzeichnis (
22
Vielen Dank Für Eure Aufmerksamkeit
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.