75
GPU-Computing mit CUDA und OpenCL in der Praxis 24. Mai 2012 Jörn Dinkla

GPU-Computing mit CUDA und OpenCL in der Praxis

Embed Size (px)

DESCRIPTION

Folien des Vortrags auf der Parallel 2012 am 24.5.2012 in Karlsruhe.

Citation preview

Page 1: GPU-Computing mit CUDA und OpenCL in der Praxis

GPU-Computing mit CUDA und OpenCL

in der Praxis

24. Mai 2012

Jörn Dinkla

Page 2: GPU-Computing mit CUDA und OpenCL in der Praxis

Motivation

Page 3: GPU-Computing mit CUDA und OpenCL in der Praxis

Vom Modell zum Bild

Computer-Grafik

Tomas Akenine-Mőller © 2002, Quelle: http://www.realtimerendering.com/

Page 4: GPU-Computing mit CUDA und OpenCL in der Praxis

Quelle: Tomas Akenine-Mőller © 2002

Echtzeit-Grafik

Vertex Pixel

Page 5: GPU-Computing mit CUDA und OpenCL in der Praxis

Rückblick

1992 … 1995 …

Page 6: GPU-Computing mit CUDA und OpenCL in der Praxis

T&L in Hardware

1999 2000

Fixed pipelines

DirectX 7.0

Page 7: GPU-Computing mit CUDA und OpenCL in der Praxis

Programmierbare Shader

2001 2002

DirectX 8.0 DirectX 9.0

Page 8: GPU-Computing mit CUDA und OpenCL in der Praxis

Shader-Sprachen

2003 2004 2005

HLSL, Cg, GLSL

GPGPU

Page 9: GPU-Computing mit CUDA und OpenCL in der Praxis

Unified Shader

2006 2007

DirectX 10.0

Page 10: GPU-Computing mit CUDA und OpenCL in der Praxis

GPU-Computing

2006 2007 2008 2009

CUDA

CTM Stream SDK

OpenCL

DirectX 11.0

Page 11: GPU-Computing mit CUDA und OpenCL in der Praxis

Massiv Parallel

Page 12: GPU-Computing mit CUDA und OpenCL in der Praxis

Schneller, Größer, Besser

Höhere Geschwindigkeit

Parallelisieren?

1080p 4K2D / QFHD 720p 576p 480p

Page 13: GPU-Computing mit CUDA und OpenCL in der Praxis

1. Golden Code

Sequentiell und korrekt

2. Golden Code parallelisieren

3. Zu GPU-Code transformieren

Entwicklungs-Methodik

Page 14: GPU-Computing mit CUDA und OpenCL in der Praxis

Parallelität finden

Eingabe

Verarbeitung

Ausgabe

Eingabe

Ausgabe

#1 #2 #3

Page 15: GPU-Computing mit CUDA und OpenCL in der Praxis

Parallelität finden

Eingabe

Verarbeitung

Ausgabe

E1

A1

#1

E2

A2

#2

E3

A3

#3

Page 16: GPU-Computing mit CUDA und OpenCL in der Praxis

Parameter: Eindeutige ID

Hole Daten anhand ID

Verarbeitung

Speichere Daten anhand ID

SPMD / SIMT

E1

A1

#1

E2

A2

#2

E3

A3

#3

Page 17: GPU-Computing mit CUDA und OpenCL in der Praxis

uchar4 p;

p.x = x+y;

p.y = x-y;

p.z = y;

p.w = 255;

SIMT: Lock-step

1 2 3 4

1 2 3 4

Page 18: GPU-Computing mit CUDA und OpenCL in der Praxis

Frameworks

Hardware

Low Level

Praktisch

Besser

CUDA Driver API Open CL

CUDA Runtime

API

Komfortabel

Thrust? PyCUDA /

PyOpenCL ?

C++ cl.hpp

OpenACC ? C++ AMP?

Plattform-Unabhängigkeit ?

Page 19: GPU-Computing mit CUDA und OpenCL in der Praxis

HelloWorld.cu

CUDA Runtime API

Kernel

Host

Page 20: GPU-Computing mit CUDA und OpenCL in der Praxis

Programm zu Code

Host Code

C/C++

Device Code

(Kernel)

Compiler

Machine Code

Compiler

LLVM / PTX / IL

Assembler

Assembler /

LLVM

Cubin / Machine

Code

Assembler (*)

JIT?

JIT?

Page 21: GPU-Computing mit CUDA und OpenCL in der Praxis

Vorteile

„Plattformunabhängig“

CPU+GPU

Vektorberechnungen

Aber

Performance von Device abhängig

„Komiteesprache“

OpenCL

Page 22: GPU-Computing mit CUDA und OpenCL in der Praxis

OpenCL / Driver API

Device

Context

Program

Kernel

Command Queue

Plattform

Aufruf

Page 23: GPU-Computing mit CUDA und OpenCL in der Praxis

WebCL

Siehe http://webcl.nokiaresearch.com/kerneltoy/

Page 24: GPU-Computing mit CUDA und OpenCL in der Praxis

Smoothing

Page 25: GPU-Computing mit CUDA und OpenCL in der Praxis

3x3 Fenster

Smoothing

0 1 2 3 4

0

1

2

3

4

0 1 2 3 4

0

1

2

3

4

0 1 2 3 4

0

1

2

3

4

Page 26: GPU-Computing mit CUDA und OpenCL in der Praxis

Für alle x,y,z in vol

sum = 0, c = 0

Für alle dx,dy,dz in Nachbarschaft

sum += vol[x+dx,y+dy,z+dz]

c += 1

vol‘[x,y,z] = sum / c

Algorithmus

Threads

Page 27: GPU-Computing mit CUDA und OpenCL in der Praxis

Extension / Größe

width, height, depth

index(x,y,z)

inBounds(x,y,z)

Extent

0 1 2 3

0

1

2

3

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Page 28: GPU-Computing mit CUDA und OpenCL in der Praxis

Accum

Akkumulator

add(value)

Akkumuliert int4

avg()

Durchschnitt

0 1 2 3 4

0

1

2

3

4

Page 29: GPU-Computing mit CUDA und OpenCL in der Praxis

Golden Code

Page 30: GPU-Computing mit CUDA und OpenCL in der Praxis

Fermi (GTX 580)

Page 31: GPU-Computing mit CUDA und OpenCL in der Praxis

x*y*z Threads Cores/SMs

Thread-Block / Work group / Tile

Grid / NDRange

Kernel-Konfiguration

0 1 2 3 4 5 6 7

0

1

2

3

4

5

6

7

0 1 2 3 4 5 6 7

0

1

2

3

4

5

6

7

0 1 2 3 4 5 6 7

0 T T T T T T T T

1 T T T T T T T T

2 T T T T T T T T

3 T T T T T T T T

4 T T T T T T T T

5 T T T T T T T T

6 T T T T T T T T

7 T T T T T T T T

Page 32: GPU-Computing mit CUDA und OpenCL in der Praxis

ExecConfig

grid

threads

stream

ExecConfig(Extent)

Kernel-Konfiguration

Page 33: GPU-Computing mit CUDA und OpenCL in der Praxis

Überblick H

ost

Algorithmus Buffer Buffer‘

Ho

st

Buffer Buffer‘

De

vic

e

Kernel Buffer Buffer‘

Ho

st

Buffer Buffer‘

De

vic

e

Kernel Buffer Buffer‘

Page 34: GPU-Computing mit CUDA und OpenCL in der Praxis

Device-Speicher

cudaMalloc(), cudaFree()

Host-Speicher

cudaMallocHost(), cudaFreeHost()

Transfer

cudaMemcpy()

Speicher-Management

Page 35: GPU-Computing mit CUDA und OpenCL in der Praxis

Host-Speicher

Virtueller

Speicher

Physikalischer

Speicher

malloc() cudaMallocHost()

Device

Speicher

Page 36: GPU-Computing mit CUDA und OpenCL in der Praxis

BaseBuffer

malloc(), free()

HostBuffer

PinnedHostBuffer

DeviceBuffer

copyFrom(), copyTo()

Versionierung

Buffer

Page 37: GPU-Computing mit CUDA und OpenCL in der Praxis

BufferPair

Paar

Host-Buffer

Device-Buffer

Methoden

updateDevice()

updateHost() H

ost

Buffer Buffer‘

De

vic

e

Kernel Buffer Buffer‘

Page 38: GPU-Computing mit CUDA und OpenCL in der Praxis

GPU-Code

Page 39: GPU-Computing mit CUDA und OpenCL in der Praxis
Page 40: GPU-Computing mit CUDA und OpenCL in der Praxis

Performance-Vergleich

Größe CPU GPU Speedup GPU+C Speedup

8 0 0 2 0,00

16 1 0 2 0,00

32 2 0 4 0,00

64 15 0 4 0,00

128 97 4 24,25 10 9,70

256 660 23 28,70 63 10,48

384 2216 78 28,41 204 10,86

512 5249 184 28,53 482 10,89

Nur GPU Mit Kopien

Und größer ?

Page 41: GPU-Computing mit CUDA und OpenCL in der Praxis

Speicherplatz: N^3

Page 42: GPU-Computing mit CUDA und OpenCL in der Praxis

Größere Volumen

Swapping

Host

Device

Page 43: GPU-Computing mit CUDA und OpenCL in der Praxis

BufferIterator

Kernel: Anpassen

BufferPair: Erweitern

Swapping

Page 44: GPU-Computing mit CUDA und OpenCL in der Praxis

Auslastung D

evic

e

Ho

st

I

K I O

O I

K I O

O I

K I O

O

La

st

Page 45: GPU-Computing mit CUDA und OpenCL in der Praxis

Streams & Overlap

Schritt Ein Stream Stream 1 Stream 2 Stream 1 Stream 2

1 H2D H2D H2D

2 Kernel 1 Kernel 1 H2D Kernel 1 H2D

3 D2H D2H Kernel 2 D2H Kernel 2

4 H2D D2H H2D D2H

5 Kernel 2 H2D Kernel 3

6 D2H Kernel 3 D2H

7 H2D D2H

8 Kernel 3

9 D2H

Kernel + Kopie

überlappend

Kernel + Kopie und

H2D und D2H

Page 46: GPU-Computing mit CUDA und OpenCL in der Praxis

Initialisierung

Parallel Für alle „ungeraden“ Partitionen p

Kopiere H2D für p in s1

Rufe Kernel auf für p in s1

Kopiere D2H für p in s1

Für alle „geraden“ Partitionen q Kopiere H2D für q in s2

Rufe Kernel auf für q in s2

Kopiere D2H für q in s2

Swapping & Streaming

Asynchron

Page 47: GPU-Computing mit CUDA und OpenCL in der Praxis

Asynchrone Kopien

Übersicht H

ost

Buffer Buffer‘

De

vic

e Kernel Buf‘ 1

Kernel Buf 2 Buf‘ 2

Buf 1

Page 48: GPU-Computing mit CUDA und OpenCL in der Praxis

Buf 2

Double Buffering H

ost

Buf 1 Out 2

De

vic

e Kernel Out 1

Kernel Buf 2 Out 2

Buf 1

Volumen

Input

Volumen

Output

Out 1

Page 49: GPU-Computing mit CUDA und OpenCL in der Praxis

HostBufferPair

Analog zu BufferPair

Buffer

HostBuffer

PinnedHostBuffer

Unterschiedliche Größe

updateFrom(), updateTo()

Klasse

Page 50: GPU-Computing mit CUDA und OpenCL in der Praxis
Page 51: GPU-Computing mit CUDA und OpenCL in der Praxis

Größe CPU GPU Speedup

8 0 0

16 0 0

32 10 0

64 20 0

128 110 0

256 660 23 10,48

384 2233 80 10,86

512 5263 183 10,89

768 17707 1718 10,31

1024 42101 4079 10,32

1152 59156 5924 9,99

Performance-Vergleich

Page 52: GPU-Computing mit CUDA und OpenCL in der Praxis

GTX 580

1632,3 GFLOPS und 194,5 GB/s

Wen es interessiert:

GFLOPS #Cores * Shader-Takt * 2

GB/s Breite [Byte] * Memory-Takt * x

GDDR3: x = 2, GDDR5: x = 4

Theorie

Page 53: GPU-Computing mit CUDA und OpenCL in der Praxis

Pro Kernel

27 Laden, 1 Speichern

638 Operationen

Arithmetische Intensität

Bei 512er Test

467,93 GFLOPS

20,54 GB/s

Optimierungspotential vorhanden!

Pi mal Daumen

Page 54: GPU-Computing mit CUDA und OpenCL in der Praxis

Maximiere …

1. Parallelität

2. Speicherdurchsatz

3. Berechnungsdurchsatz

Optimierung

Page 55: GPU-Computing mit CUDA und OpenCL in der Praxis

Streams

Asynchrone Kopien und Kernel

Auslastung des Device

Grid

Auslastung der SMs

Thread-Block

„Occupancy“

Maximiere Parallelität

Page 56: GPU-Computing mit CUDA und OpenCL in der Praxis

Mehrere Thread-Blöcke pro SM

Speicherzugriffe verstecken

O(1) Scheduler

Occupancy

TB SM TB TB TB TB -- -- --

Page 57: GPU-Computing mit CUDA und OpenCL in der Praxis

Occupancy Calculator

Page 58: GPU-Computing mit CUDA und OpenCL in der Praxis

Speicher-Architektur

CPU 1

Core

L1 / L2

Core

L1 / L2

L3 Cache

Global Memory

Bus / Memory Controller

GPU

Global Memory

Constant Texture

Prozessor (SM)

Local / Shared / L1

Registers

C C C C

L2 Cache

8-16 8-20

160-

200

1600

8000

Page 59: GPU-Computing mit CUDA und OpenCL in der Praxis

„Coalesced“ Zugriffe

32, 64, oder 128-byte

„Alignment“

Max. Speicherdurchsatz

Page 60: GPU-Computing mit CUDA und OpenCL in der Praxis

Pinned-Host-Speicher

Minimiere Kopien

Benutze On-Chip-Speicher

Shared/Local, Register

Konfiguriere Cache

Max. Speicherdurchsatz

Page 61: GPU-Computing mit CUDA und OpenCL in der Praxis

int tid = treadIdx.x;

if (tid < 2) {

o[tid] = 1;

} else {

o[tid] = 2;

}

Divergenz

1 2 3 4

1 2 3 4

Page 62: GPU-Computing mit CUDA und OpenCL in der Praxis

Minimiere Divergenz

Loop-Unrolling

Berechnen statt Speichern

Arithmetik

Präzision vs. Geschwindigkeit

Fusion von Kerneln

Max. Berechnungen

Page 63: GPU-Computing mit CUDA und OpenCL in der Praxis

Synchronisation

Innerhalb Thread-Block

__syncthreads()

Atomare Zugriffe

atomicAdd()

Speicher

Zwischen Kernel-Aufrufen

Page 64: GPU-Computing mit CUDA und OpenCL in der Praxis

Weiterführend …

Page 65: GPU-Computing mit CUDA und OpenCL in der Praxis

JNI

JCuda

Javacl, Jocl

Eigenes API

Aparapi, Java-GPU

JVM

Page 66: GPU-Computing mit CUDA und OpenCL in der Praxis

JVM

Hardware

Low Level

Praktisch

Besser

CUDA Driver API Open CL

CUDA Runtime

API

Komfortabel

C++ cl.hpp

JCUDA

JavaCL

Page 67: GPU-Computing mit CUDA und OpenCL in der Praxis

CUDA mit Java

Page 68: GPU-Computing mit CUDA und OpenCL in der Praxis

Hello, Groovy CUDA!

JCUDA

Page 69: GPU-Computing mit CUDA und OpenCL in der Praxis

Hello, Groovy OpenCL!

JavaCL

Page 70: GPU-Computing mit CUDA und OpenCL in der Praxis

Hello, Scala + GPU

JavaCL

Page 71: GPU-Computing mit CUDA und OpenCL in der Praxis

Vorteile

Entwicklungsgeschwindigkeit

Host-Code

Nachteile

Datentypen

Getrennt Debuggen

Fazit JVM

Page 72: GPU-Computing mit CUDA und OpenCL in der Praxis

„Richtig“ eingesetzt unschlagbar!

Folien & Code

http://dinkla.net/parallel2012

Fazit

Page 73: GPU-Computing mit CUDA und OpenCL in der Praxis

Sanders, Kandrot

CUDA by Example

Kirk, Hwu

Programming Massively

Parallel Processors

Literatur: CUDA

Page 74: GPU-Computing mit CUDA und OpenCL in der Praxis

Scarpino

OpenCL in Action

Gaster et.al.

Heterogeneous Computing

With OpenCL

Literatur: OpenCL

Page 75: GPU-Computing mit CUDA und OpenCL in der Praxis

Hwu (Ed.)

GPU Computing Gems

Emerald Edition

Hwu (Ed.)

GPU Computing Gems

Jade Edition

Literatur: CUDA