stefan auer computer graphics & visualization graphics processing unit general purpose...

71
Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

Upload: hagan-bommersbach

Post on 06-Apr-2015

127 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

Stefan Auer

computer graphics & visualization

GraphicsProcessingUnit

General Purpose Computation on

Page 2: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 3: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

1) Motivation

- GPUs sind äußerst leistungsfähige Parallelrechner- Beispiel: Nvidia GeForce 8800 GTX

- 128 Stream Prozessoren- ~690 millionen Transistoren- 1350 MHz Shader clock speed- 86 GB/s Speicherbandbreite (Peak)- 345 Gflops Floatingpoint-Leistung (Peak, Multiply-

ADD)

- Vergleich: Intel Core 2 Quad Q6600- 4 Kerne (zwei Doppelkernprozessoren)- ~580 millionen Transistoren- 2400 MHz Takt- ~5 GB/s Speicherbandbreite (gemessen)- ~40 Gflops FPU-Leistung (gemessen, Whetstone)

Page 4: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

1) Motivation

Gflops FMUL FADD50% FMUL / 50% FADD

FMADD

GeForce 8800 GTX 172,8 172,8 172,8 345,6

GeForce 8800 GTS 115,2 115,2 115,2 230,4

Core 2 Extreme QX6700 42,7 42,7 85,3 42,7

Core 2 Extreme X6800 23,5 23,5 46,9 23,5

Quelle: behardware.com

FMUL FADD 50% FMUL / 50% FADD

FMADD 0

100

200

300

400

GeForce 8800 GTX

GeForce 8800 GTS

Vergleich der Floatingpointleistung

Gflops

Page 5: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

1) Motivation

- Leistungszuwachs war bei GPUs in letzter Zeit größer als bei CPUs (GPUs profitieren mehr als CPUs von Verbesserungen der Fertigung)

2004 2005 2006

Pentium 4 660

Pentium D 960

Core 2 Duo E6600

Core 2 Quad Q6600

CPU FPU-Leistung

2004 2005 2006

6800 GT

7900 GTX

8800 GTX

GPU Shader-Leistung (SM 2.0)

100%

1355%

100%

503%

Quelle: tomshardware.com

Page 6: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

1) Motivation

- Einsatzzweck von GPUs ist das Rendering von interaktiven 3D Anwendungen

-> GPUs sind vergleichsweise preiswert (Videospiele sind Massenmarkt)

- GeForce 8800 GTX aktuell ~ 450.- €

Page 7: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

GPUCPU

• Anwendung

• Transformation & (Vertex-) Beleuchtung

• Geometrie Verarbeitung

• Rasterisierung

• Schattierung

• Tests

• Render Target

• (Framebuffer,Texturen)

Vertices Primitive(z.B. Dreiecke)

Programmierbare Rendering Pipeline

Vertex Shader

Geometrie Shader (DX10)

Pixel Shader

Fragmente(„Pre-Pixels“)

Pixel(Farbe, Tiefe)

1) Motivation

Page 8: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 9: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

L2 Tex

Cull / Clip / Setup

Shader Instruction Dispatch

Fragment Crossbar

MemoryPartition

MemoryPartition

MemoryPartition

MemoryPartition

Z-Cull

DRAM(s) DRAM(s) DRAM(s) DRAM(s)

Host / FW / VTF

Quelle: Nvidia

8 vertex shaderpipelines

24 pixel shader pipelines

16 raster operation pipelines32 ppc

Nvidia G70Architektur(GeForce 7800)

Page 10: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

Unified shader (1)

- Höhere Flexibilität- geometry shader, Spielphysik ?, general purpose

- Bessere Ausnutzung der Hardware

Viel GeometrieWenig Geometrie Lastverteilung

Quelle: Nvidia

Page 11: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

Unified shader (2)

Vertex Shader

Pixel Shader

Idle hardware

Vertex Shader

Pixel Shader

Idle hardware

Heavy Geometry

Heavy Pixel

Quelle: Nvidia

Page 12: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

Unified shader (3)

Heavy Geometry

Heavy Pixel

Quelle: Nvidia

Unified Shader

Unified Shader

Vertex workload

Pixelworkload

Pixel workload

Vertexworkload

Page 13: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

L2

FB

SP SP

L1

TF

Th

read

Pro

cessor

Vtx Thread Issue

Setup / Rstr / ZCull

Geom Thread Issue Pixel Thread Issue

Data Assembler

Host

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

L2

FB

L2

FB

L2

FB

L2

FB

L2

FB

Quelle: Nvidia

12

8 u

nifi

ed sh

ader p

ipelin

es

6 R

OPs 1

92

ppc

Nvidia G80Architektur

(GeForce 8800)

Page 14: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

CPU vs. GPU: CPU Architektur

- CPUs implementieren Von Neumann Architektur

- Von Neumann Flaschenhals- Teilung von ALU und Speicher schafft Bandbreitenprobleme- heutige ALUs sind wesentlich schneller als die

Datenverbindungen- cache management notwendig > großer Kontroll-Overhead- > für rechenintensive Anwendungen verbleibt weniger Leistung

Page 15: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

CPU vs. GPU: GPU Architektur

- GPUs entsprechen annähernd Stream Processing Architektur

- Anwendung organisiert in Streams und Kernel- fördert Lokalität der Daten und Parallelität ihrer Verarbeitung

Page 16: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

2) Hardware Design aktueller GPUs

CPU vs. GPU: Gegenüberstellung

- CPU: profitiert hauptsächlich von Aufgabenparallelität

- schnelle (aber kostspielige) Caches- Pipelines auf Sprünge optimiert- wenige Ausführungseinheiten (1,2,4,...)- hohe Leistung bei Bearbeitung einzelner Threads

- GPU: profitiert zusätzlich von Datenparallelität

- sehr viele ALUs, spezialisiert auf floating-point Arithmetik

- sehr hohe Speicherbandbreite (aber hohe Latenz)- tausende Threads mit gleichem Kernel

Page 17: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 18: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

„Standard“-Verwendung der Pipeline bei GPGPU

FragmentProzessor

2„s

cree

n“

0 1

1

2

FrameBuffer(s)

TextureBuffer

RasterisiererVertexProzessor

VertexTextureFetch

Renderto

TextureTexture

Sampling(Gather)

Page 19: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

Texturen als computational grids

- (ein) typischer GPGPU Programmierstil

- Texturen repräsentieren Streams (Texel = Datenelement)

- Fragmentprogramme (pixel shader) repräsentieren Kernel

- Zeichnen eines Full-Screen-Rechtecks repräsentiert Berechnungschritt

Page 20: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

- viele Berechnungen lassen sich gut auf Grids abbilden:- Matrix Algebra- Bild- und Volumenverarbeitung- Physiksimulationen- Global Illumination

- ray tracing, photon mapping, radiosity

- Streams die keinen Grids entsprechen lassensich meist darauf abbilden

Page 21: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU „Hello World“ (1)

- Bildverarbeitung: 3x3 Faltung - Input: Bild, Gewichtungen- Output: „geblurrtes“ Bild

CPU Version:

image = loadImage(WIDTH, HEIGHT);blurImage = allocZeros(WIDTH, HEIGHT);

for (x=0; x < WIDTH; x++) for (y=0; y < HEIGHT; y++) for (i=-1; i <= 1; i++) for (j=-1; j <= 1; j++) float w = computeWeight(i,j); blurImage[x][y] += w * image[x+i, y+j];

Page 22: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU „Hello World“ (2)

GPU Version:

1) Lade image als Textur

2) erstelle blurImage Texturwelche das Ergebnis aufnimmt

Page 23: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU „Hello World“ (3)

GPU Version:

3) Lade Fragment-Programm (Kernel)Beispielcode in CG:

float4 blurKernel(uniform samplerRECT image, float2 winPos : WPOS, out float4 blurImage ) { blurImage = float4(0,0,0,0); for (i=-1; i <= 1; i++) { for (j=-1; j <= 1; j++) { float2 texCoord = winPos + float2(i,j); float w = computeWeight(i,j); blurImage += w * texRECT( image, texCoord ); } }}

Page 24: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU „Hello World“ (4)

GPU Version:

4) wähle Viewport-Größe entsprechend Bildgrößekonfiguriere Vertex Pipeline so dass sie „nichts“ tutBeispielcode für OpenGl:

glMatrixMode( GL_PROJECTION );glLoadIdentity();gluOrtho2D(0, 1, 0, 1);glViewport(0, 0, WIDTH, HEIGHT );glMatrixMode( GL_MODELVIEW );glLoadIdentity();

Page 25: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU „Hello World“ (5)

GPU Version:

5) binde image als Textur, blurKernel als Fragment-Programm und blurImage als Render-Target

6) zeichne ein Full-Screen-Rechteck

glBegin( GL_TRIANGLES );glVertex2f(0, 0);glVertex2f(2, 0);glVertex2f(0, 2);glEnd();

„scr

een“

0 1

1

2

2

Page 26: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

Was passiert?

- blurKernel wird für jedes Fragment einmal ausgeführt

- das Rendering ersetzt die äußeren beiden Schleifen der CPU-Version

- blurKernel führt für jedes Fragment9 Gather (p=a[i]) Operationen durch undgewichtet jeden Wert

- die „geblurrten“ Ergebnis-Pixel werdenin den Framebuffer bzw. in dieblurImage Textur geschrieben

Page 27: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (1)

- Scatter Nachbildung- Problem: a[i]=p

- indirektes Schreiben- Position des Fragments kann

im Pixel-Shader nicht mehrgeändert werden

- Lösung 1: Auf Gather abbilden- erster Schritt: Kernel 1 ermittelt

Werte und speichert inZwischenergebnis

- zweiter Schritt: Kernel 2 sammeltZwischenergebnisse an derpassenden Stelle ein

1 2

Page 28: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (2)

- Scatter Nachbildung- Lösung 2: Adresssortierung

- erster Schritt: Kernel 1 ermitteltWerte und speichert sie gemeinsammit Zieladresse in Zwischenergebnis

- zweiter Schritt: Kernel 2 führt aufdem Zwischenergebnis bitonic-sortnach Adressen durch

- dritter Schritt: Kernel 3 findet diepassenden Werte durch binäreSuche

1 9 5

8 1 3

3 6 5

1

1 1 3

3 5 5

6 8 9

2

1+1 3+3

5+5 6

8 9

3

Page 29: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (3)

- Scatter Nachbildung- Lösung 3: Vertex Shader

- führe Rechnung im Vertex Shader durch

- Zeichne Punkte

- Vertex Position = Adresse

- führe Rechnung im Pixel Shader durch

- schreibe Adresse und Wert in Textur

- Zeichne Punkte

- lies Textur im Vertex Shader (Vertex Texture Fetch)und passe Position an Adresse an

Page 30: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (4)

- Reduce- Problem: Reduktion der Wertanzahl durch

Zusammenfassung- Lösungen: Zeilen-/Spaltenweise, Blockweise

immer mehrere Passes notwendig

- Filtering- Problem: Reduktion der Wertanzahl durch entfernen

bestimmter Werte

- Sortierung- Lösung: Sorting Networks

Page 31: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (5)

- Suche- Problem: Suche nach bestimmten Werten, Werten die

bestimmte Eigenschaften erfüllen oder Nachbarn von bestimmten Werten

- sinnvoll auf GPU bei vielen parallelen Suchen

- Datenstrukturen- Arrays und Matrizen (dicht- und dünnbesetzt)- adaptive Datenstrukturen (adp. shadow maps, octrees,…)

Page 32: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

3) GPGPU mit Standard APIs

GPGPU Techniken (6)

- Branching- statisch

- vermeiden von Branches, wenn vorab bekannt ist welche Elemente betroffen sind

- Nutzung des z-Buffers- bedingte writes- Nutzung mathematischer Konstrukte als Branch-Ersatz- sinnvolle Verwendung der Branching-Unterstützung in

shader-model 3 und 4

Page 33: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 34: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

4) Anwendungsbeispiele

Grundlegende (aus der Mathematik):

- Differentielle Gleichungen & …

- gewöhnliche (ODE), z.B. für Partikel Systeme

- partielle (PDE), z.B. für Fluid Simulationen (Navier Stokes)

- … Lineare Algebra

- z.B. für numerische Simulation, Ray tracing, realtime Shading & Lighting

Page 35: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

4) Anwendungsbeispiele

Allgemeine (1):

- Relationale Datenbanken

- Query-Beschleunigung z.B. durch beschleunigtes Join

- Simulation physikalischer Phänomene

- finite Differenzen & finite Elemente

- z.B. für Fluide (Flüssigkeiten, Gase)

- Signal- und Bildverarbeitung

- Segmentierung: Erkennen von „Objekten“(z.B. Tumor in medizinischen Scans)

- Computer Vision

- ...

Page 36: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

4) Anwendungsbeispiele

Allgemeine (2):

- Global Illumination- Ray tracing- Photon mapping- Radiosity- Subsurface scattering

Page 37: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

4) Anwendungsbeispiele

Havok FX

- entstanden durch Zusammenarbeit von Havok und Nvidia

- Nutzung der GPU für Effekt Physik in Spielen

Page 38: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 39: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

Nachteile von Grafik APIs:

- sehr hohe Lernkurve für Nicht-Grafik-Entwickler- Pipeline?- Texturen? (sampler, filtering, blending)- Framebuffer?

- unpassende Abstraktionen für Nicht-Grafik-Programme- Vertices/Primitive/Fragmente + jeweils spezielle Programme dafür

- unflexibler Speicherzugriff- fehlendes Scatter

- zuwenig Kontrolle- (Grafik-) Treiber + API treffen wichtige Entscheidungen- Treiber ändern sich- Grafik-Optimierungen teilweise kontrapoduktiv

Page 40: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

L2

FB

SP SP

L1

TF

Th

read

Pro

cessor

Vtx Thread Issue

Setup / Rstr / ZCull

Geom Thread Issue Pixel Thread Issue

Data Assembler

Host

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

L2

FB

L2

FB

L2

FB

L2

FB

L2

FB

Quelle: Nvidia

Nvidia G80als GPU

Page 41: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

Quelle: Nvidia

Load/store

Global Memory

Thread Execution Manager

Input Assembler

Host

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Load/store Load/store Load/store Load/store Load/store

Nvidia G80als GPGPU

Page 42: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA

- Compute Unified Device Architecture

- Plattform für GPGPU auf Nvidia G80 (und höher)

- nutzt das C Subset von C++ (mit ein paar Erweiterungen) als Programmiersprache

- ersetzt (für GP-Anwendungen) Grafik API und Treiber

- CUDA und Grafik Anwendungen parallel möglich (OS-Multitasking)

Page 43: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

CUDA Software Stack

5) GPGPU alla Nvidia

CPU(Host)

Anwendung

CUDALibraries

CUDARuntime

CUDA Driver

GPU

Page 44: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA aus Compiler-Sicht

- NVCC ist compiler driver (ähnlich gcc)

- NVCC verarbeitet CUDA Programme (.cu)

- Host-Code wird entweder extrahiert (-> .cpp) odersofort kompiliert (z.B. Visual Studio Kompilier)

- Device Code wird für PTX kompiliert

- PTX Code wird zur Installationszeit für dasjeweilige Device (z.B. G80) kompiliert

Page 45: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

PTX- PTX: parallel thread execution

- virtuelle Maschine und ISA

- Programmiermodell

- Abstraktion von Ressourcen und State

- ISA: instruction set architecture

- formale Spezifikation des Verhaltens eines Prozessors aus Sicht des Programmierers

- PTX-Übersetzter ist optimizing compiler

- übersetzt PTX in Zielmaschinencode (z.B. für G80)

- wird zur Installationszeit ausgeführt

- CUDA Treiber implementiert die virtuelle Maschine

- stellt Übersetzer zur Verfügung

Page 46: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Programmiermodell

- GPU ist Coprozessor der CPU (CPU = Host)

- datenparallele Programmteile werden für die GPU kompiliert und dort als Kernel ausgeführt

- implizites Multithreadding: derselbe Kernel wird auf der GPU (hundertfach) parallel von (tausenden) Threads auf unterschiedlichen Daten (SIMD) ausgeführt

- eigener Speicher für CPU (host memory) und GPU (device memory); Hin-und-Her-Kopieren durch DMA

- indirekte Ressourcenverteilung (Threads, Register, Shared-Memory) durch Programmierer notwendig

Page 47: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

5) GPGPU alla Nvidia

Stefan Auer Zahlen gelten für GeForce 8800

CUDA Threadmanagement- Grid

- alle Threads führen denselben Kernel aus

- alle Blöcke haben die selben Dimensionen

- Block- zu jeder Zeit nur ein

Block aktiv auf jedem Multiprozessor

- alle Threads teilen sich Register (per Thread) und Shared Memory (per Block)

- Synchronisation zwischen Threads möglich

GridGrid

Grid

Block(0,0)

Block(0,1)

Block(0,2)

Block(0,3)

Block(1,0)

Block(1,1)

Block Block

Block(2,0)

Block(2,1)

Block Block

Block…

Block…

Block…

Block…

65535

65

53

5

BlockThread(0,0)

Thread(0,1)

Thread(0,2)

Thread(1,0)

Thread(1,1)

Thread(1,2)

Thread(2,0)

Thread(2,1)

Thread(2,2)

Thread Thread Thread

512

51

2

64

512

Page 48: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

GPU

5) GPGPU alla Nvidia

Stefan Auer Zahlen gelten für GeForce 8800

CUDA Threadausführung

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

- ein Multiprozessor führt zu jeder Zeit nur einen aktiven Block aus

- ein Multiprozessor kann 8 Blöcke ausführen (scheduling)

- die Threads eines Blocks werden ausgeführt als „Warps“ a 32 Threads

- ein Multiprozessor kann insgesamt 24 Warps ausführen (scheduling)

- eine Instruktion benötigt pro Warp je nach Art zwischen 4 (z.B. FMADD) und 32 (z.B. IMUL) clock cycles

Page 49: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

GPU

5) GPGPU alla Nvidia

CUDA Speicherbereiche (1)

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

DeviceMemory

Constants(cached)

Textures(cached)

Global(uncached)

Local(uncached)

Jeder Thread kann:

- pro Thread Register Lesen/Schreiben

- pro Thread Local Memory L/S

- pro Block Shared Memory L/S

- pro Grid Global Memory L/S

- pro Grid Constant Memory nur L

- pro Grid Texture Memory nur L

Page 50: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

GPU

5) GPGPU alla Nvidia

CUDA Speicherbereiche (2)

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

DeviceMemory

Constants(cached)

Textures(cached)

Global(uncached)

Local(uncached)

Alle Threads eines Blocks teilen sich Shared Memory (per Block) und Register (per Thread)

-> verfügbare Registerzahl = Register pro SM / Threads pro Block

Kernel die mehr Register verwenden können nicht gestartet werden

Page 51: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

GPU

5) GPGPU alla Nvidia

CUDA Speicherbereiche (3)

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

DeviceMemory

Constants(cached)

Textures(cached)

Global(uncached)

Local(uncached)

Der Host kann:

- Constant Memory L/S

- Texture Memory L/S

- Global Memory L/S

Page 52: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

GPU

5) GPGPU alla Nvidia

Stefan Auer Zahlen gelten für GeForce 8800 GTX

CUDA Speicherbereichgrößen

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

DeviceMemory

Constants(cached)

Textures(cached)

Global(uncached)

Local(uncached)

- Register pro SM 8192 (-> 16-256 pro Thread)

- Shared Memory pro SM 16 kB

- Constant Memory 64 kB

- Constant Mem. Cache pro SM 8 kB

- Kernelsize 2 M Instr.

- Device Memory gesamt 758 MB

Page 53: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

GPU

5) GPGPU alla Nvidia

CUDA Synchronisation

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Parallel DataCache

Streaming Multiprocessor (SM)

SP 0

SP 1

SP 2

SP 3

SP 4

SP 5

SP 6

SP 7

Constant L1 Cache

SFU

SFU

Instruction Fetch

Instruction L1 Cache

Thread / Instruction Dispatch

Shared Memory

RF 0

RF 1

RF 2

RF 3

RF 4

RF 5

RF 6

RF 7

DeviceMemory

Constants(cached)

Textures(cached)

Global(uncached)

Local(uncached)

- keine Synchronisation zwischen Threads unterschiedlicher Blöcke

- Ausführungsreihenfolge generell undefiniert

- Scattersuppport -> Schreiben mehr als ein Thread an selbe Stelle (shared oder global)-> undefiniert

- Synchronisationspunkte (Barrieren)

- Atomare Operationen (Read-Modify-Write)(nur Compute Capability 1.1, nur 32 bit INT)

Page 54: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA aus Programmierersicht (1)

C/C++ mit ein paar kleinen Erweiterungen:

- Spezifikation des Funktionstyps

- __host__, __global__, __device__

- Spezifikation des Variablentyps

- __device__, __constant__, __shared__

- Kernelausführungskonfiguration

- KernelFunc<<<500, 123>>>(...)

Page 55: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA aus Programmierersicht (2)

Einige integrierte Variablen:

- gridDim, blockIdx, blockDim, threadIdx

zusätzliche Speicherverwaltungs-Funktionen

- cudaMalloc(), cudaFree()

- cudaMemcpy(), cudaMemcpy2D()

Page 56: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Beispiel: Matrix Mul- P=M*Njeweils mit Größe WIDTH x WIDTH

- jeder Thread behandelt ein Element aus P

- Nutzung nur eines Blocks-> WIDTH <= sqrt(512)

- schlechtes Verhältnis vonOPs zu Speicherzugriffen(ca. 1:1) -> keinMusterbeispiel

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 57: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

Matrix Mul als Host (CPU) Programm

void MatrixMulOnHost(const Matrix M, const Matrix N, Matrix P){ for (int i = 0; i < M.height; ++i) for (int j = 0; j < N.width; ++j) { double sum = 0; for (int k = 0; k < M.width; ++k) { double a = M.elements[i * M.width + k]; double b = N.elements[k * N.width + j]; sum += a * b; } P.elements[i * N.width + j] = sum; }} M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 58: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Matrix Mul: Hauptprogramm

int main(void) { // Allocate and initialize the matrices Matrix M = AllocateMatrix(MATRIX_SIZE, MATRIX_SIZE, 1); Matrix N = AllocateMatrix(MATRIX_SIZE, MATRIX_SIZE, 1); Matrix P = AllocateMatrix(MATRIX_SIZE, MATRIX_SIZE, 0);

// M * N on the device MatrixMulOnDevice(M, N, P);

// Free matrices FreeMatrix(M); FreeMatrix(N); FreeMatrix(P); return 0;}

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 59: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Matrix Mul: Host Funktion (1)

// Matrix multiplication on the devicevoid MatrixMulOnDevice(const Matrix M, const Matrix N, Matrix P){ // Load M and N to the device

Matrix Md = AllocateDeviceMatrix(M); // contains cudaMalloc() CopyToDeviceMatrix(Md, M); // contains cudaMemcpy() Matrix Nd = AllocateDeviceMatrix(N); CopyToDeviceMatrix(Nd, N);

// Allocate P on the device Matrix Pd = AllocateDeviceMatrix(P); CopyToDeviceMatrix(Pd, P); // Clear memory

...

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 60: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Matrix Mul: Host Funktion (2) ... // Setup the execution configuration dim3 dimBlock(MATRIX_SIZE, MATRIX_SIZE); dim3 dimGrid(1, 1);

// Launch the device computation threads! MatrixMulKernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd);

// Read P from the device CopyFromDeviceMatrix(P, Pd); // contains cudaMemcpy()

// Free device matrices FreeDeviceMatrix(Md); // contains cudaFree() FreeDeviceMatrix(Nd); FreeDeviceMatrix(Pd);}

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 61: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Matrix Mul: Kernel// Matrix multiplication kernel – thread specification__global__ void MatrixMulKernel(Matrix M, Matrix N, Matrix P){ // 2D Thread ID int tx = threadIdx.x; int ty = threadIdx.y;

// Pvalue is used to store one matrix element computed by the thread

float Pvalue = 0; for (int k = 0; k < MATRIX_SIZE; ++k) { float Melement = M.elements[ty * M.pitch + k]; float Nelement = N.elements[k * N.pitch + tx]; Pvalue += Melement * Nelement; } P.elements[ty * P.pitch + tx] = Pvalue;}

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

Page 62: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Performance Guidelines- auf hohe arithmetische Dichte achten

- Speicher Latenz verbergen (teilweise schon durch Compiler)

- Shared Memory (on chip) ausnutzen

- Cache-freundliche Speicherzugriffe

- Zugriff auf lokalen und globalen Speicher (uncached) meiden

- viele (tausende) Blöcke und Threads verwenden

Page 63: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

Zukunft von CUDA- Nvida bietet spezielle GP Hardware an: Tesla

- Nächste GPU Generation (G90) bringt wichtige Änderungen für GPGPU (z.B. double precision), jedoch teils nur für Tesla

Page 64: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

5) GPGPU alla Nvidia

CUDA Bewertung+ für nicht grafiknahe Anwendungen besser geeignet als

Grafik-API

+ erstes Produkt das eine kritische Masse von Nicht-Grafik-Programmierern für GPGPU interessieren könnte

+/- Weiterentwicklung könnte von kommerziellem Erfolg der damit verbundenen Nvidia Produkte (Tesla) abhängen

- noch nicht ausgereift (Dokumentation mager, Programmierung könnte eleganter sein)

- setzt zwingend Nvidia GPUs voraus

Page 65: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

Inhalt

1) Motivation

2) Hardware Design aktueller GPUs

3) GPGPU mit Standard APIs

4) Anwendungsbeispiele

5) GPGPU a la Nvidia

6) GPGPU a la AMD/ATI

Page 66: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

6) GPGPU alla AMD/ATI

data parallel virtual machine (DPVM) (1)

- Grundgedanken:

- Programmierer soll GPGPU-relevante Hardware möglichst direkt ansteuern können- command processor:

liest command buffer und verteilt Arbeit auf prozessor arrays- data parallel processor arrays:

Floating Point Prozessoren; führen nativen Binärcode aus- memory controler:

verwaltet GPU zugreifbaren Speicher; Anwendung trägt Verantwortung: Speicherbereiche und -Formate, Cach-Invalidierung

- rein grafikrelevante Hardware bleibt versteckt

- Standard-API und Treiber wird umgangen

Page 67: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

6) GPGPU alla AMD/ATI

data parallel virtual machine (DPVM) (2)

Page 68: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

6) GPGPU alla AMD/ATI

data parallel virtual machine (DPVM) (3)

- Implementierung für die X1k Serie heißt CTM (close to metal)- Beschreibung der Architektur (ISA, Ressourcen, etc.)- Runtime als low level Treiberkomponenten- Support Librarys

- command buffer Generierung- Speicherallokation- Assembler

- Implementierung von high-level-Tools (Programmiersprachen, Debugger, Bibliotheken) bleibt Dritten überlassen

Page 69: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

6) GPGPU alla AMD/ATI

DPVM/CTM Bewertung

+ interessant für Tool-Entwickler

+ ermöglicht low-level Optimierungen

- für viele Programmierer uninteressant, da ZU nah an Hardware (unausgereifter GPU-Assembler vs. ausgereiftes aber unpassendes Grafik-API)

Page 70: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

Stefan Auer

6) GPGPU alla Nvidia

mögliche GPGPU Zukunft bei AMD

- AMD Fusion- heterogene Mehrkernprozessoren- CPUs und GPUs auf einem Die- Performancesteigerung bei

Speicherzugriff denkbar

Speicher

CPU GPU

General Purpose Data Centric Graphics Centric Media Centric

Quelle: AMD

Page 71: Stefan Auer computer graphics & visualization Graphics Processing Unit General Purpose Computation on

computer graphics & visualization

fin