22
CUDA Ein Vortrag von Simon Bayer 1

CUDA Ein Vortrag von Simon Bayer 1. 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

Embed Size (px)

Citation preview

Page 1: CUDA Ein Vortrag von Simon Bayer 1. 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

1

CUDAEin Vortrag von Simon Bayer

Page 2: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 3: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 4: CUDA Ein Vortrag von Simon Bayer 1. 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

4

Gliederung

4. API5. Beispiele

5.1. FindClosestPoint Brute Force5.2. Beschleunigung 15.3. Beschleunigung 2

Page 5: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 6: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 7: CUDA Ein Vortrag von Simon Bayer 1. 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

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>>>

Page 8: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 9: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 10: CUDA Ein Vortrag von Simon Bayer 1. 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

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.

Page 11: CUDA Ein Vortrag von Simon Bayer 1. 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

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.

Page 12: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 13: CUDA Ein Vortrag von Simon Bayer 1. 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

13

Wichtig: Speicherarten

Page 14: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 15: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 16: CUDA Ein Vortrag von Simon Bayer 1. 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

16

Tiling / Blocking

• Geschwindigkeit:• Shared Memory > Global Memory * 100 !!!

=> Block aus Global Memory laden und Elemente aus Block aus Shared Memory ansprechen

-> Tafel

Page 17: CUDA Ein Vortrag von Simon Bayer 1. 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

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

Page 18: CUDA Ein Vortrag von Simon Bayer 1. 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

18

Beispiel: FindClosest

• Veranschaulichung in 2D

Ergebnis hier:i[0] = 2i[1] = 2i[2] = 1

1

2

0

Page 19: CUDA Ein Vortrag von Simon Bayer 1. 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

19

Beispiel: FindClosest

3D in Intuitivem Java-Code

(gezeigt)

Page 20: CUDA Ein Vortrag von Simon Bayer 1. 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

20

Beispiel: FindClosest

CUDA: auch gezeigt und veranschaulicht

Page 21: CUDA Ein Vortrag von Simon Bayer 1. 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

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)

Page 22: CUDA Ein Vortrag von Simon Bayer 1. 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

22

Vielen DankFür Eure Aufmerksamkeit