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

GPU-Computing mit CUDA und OpenCL in der Praxis

Jul 07, 2015

Download

Technology

Joern Dinkla

Folien des Vortrags auf der Parallel 2012 am 24.5.2012 in Karlsruhe.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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