GPGPU Programming - Computer Architecture Group

ra.ziti.uni.heidelberg.de

GPGPU Programming - Computer Architecture Group

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream Computing

Seminar HWS 08/09 by Erich Marth

1


Inhalt

• Einführung

- Warum, Vorteile, Motivation

• nvidia CUDA

- Überblick, API - Details, Beispiele

• AMD Stream Computing

- Überblick, API - Details, Beispiele

• CUDA vs. Stream Computing

- wesentliche Unterschiede

GPGPU Programming

• CPU vs. GPU

- verw. Systeme, Beispiel, Benchmark-Ergebnisse

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

2


Warum

HD4870 X2

Tesla S1070 1U

HD4800

Geforce 9800 X2

HD3800

nVidia Tesla C1060

GPGPU Programming

AMD

0

nvidia Phenom CUDA vs. AMD/ATI Stream

4

400

800

Number of Cores

1.200

Einführung

AMD/ATI nVidia CPU

1.600

Seminar HWS 08/09 by Erich Marth

3


Warum

Computing Cores

GPU Cores

Memory

Memory

Bandwidth

GPGPU Programming

Flops

nvidia CUDA vs. AMD/ATI Stream

Einführung

HD 4870 X2 Tesla S1070 1U AMD Phenom X4

1600 960 4

2x 4x -

2 GB 16 GB 2^40

115 GB/sec 408GB/sec 17.1GB/sec*

2.4 teraFLOPS 4 teraFLOPS ~ 40 GFLOPS

* DDR2-1066

http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_15331_15332^15334,00.html

Seminar HWS 08/09 by Erich Marth

4


Vorteile

• MMTA (Massively Multithreaded Architecture)

100x, 1000x Threads laufen nahezu gleichzeitig (1:1 Abbildung)

Hoher Parallelisierung-Grad durch Anzahl der verfügbaren Cores

• High Memory Bandwidth on device

DDR3-1600 max. 25.6 GB/s (per Spezifikation) in COTS Systems

verglichen mit 141.7 GB/s Bandbreite auf einer GeForce GTX 280

• Preis/Leistungsverhältniss

GPGPU Programming

Für Privatpersonen oder Universitäten gutes Preis/Leistungsverhältniss

nvidia CUDA vs. AMD/ATI Stream

Einführung

Seminar HWS 08/09 by Erich Marth

5


Motivation

h.264 Encoding

k-nearest neighbor

Klassifizierungsalgorithmus

Sum-Product Solver

n=∑(x)∏(y)

Molecular Dynamics of DNA

GPGPU

Real-Time Visual

Programming

Tracking 10x

nvidia CUDA vs. AMD/ATI Stream

SpeedUp

18x

470x

270x

18x

Einführung

http://www.nvidia.com/object/cuda_home.html

Seminar HWS 08/09 by Erich Marth

6


Inhalt

✓ Einführung

Warum, Vorteile, Motivation

• nvidia CUDA

- Überblick, API - Details, Beispiele

• AMD Stream Computing

- Überblick, API - Details, Beispiele

• CUDA vs. Stream Computing

- wesentliche Unterschiede

GPGPU Programming

• CPU vs. GPU

- verw. Systeme, Beispiel, Benchmark-Ergebnisse

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

7


Überblick

• entwickelt von nvidia

große Entwicklergemeinde, gute Dokumentation, Kurse an Uni’s

http://www.nvidia.com/object/cuda_home.html

• Erweiterung der Sprache C/C++

geringe Einarbeitungszeit

keine Grafik-Kenntnisse notwendig

• CUDA Libraries

CUBLAS - Basic Linear Algebra Subprograms

CUFFT - Fast Fourier Transformation

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA

Seminar HWS 08/09 by Erich Marth

8


Begriffe

• Device

Grafikkarte bestehend aus Speicher und GPU

• Kernel

Programm welches auf dem Device ausgeführt wird

• Host

Rechner welcher Kernels auf dem Device startet

nvidia CUDA

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

9


Modell

• Kernel

wird auf ein Grid abgebildet

• Grid

besteht aus Blöcken in 2D-Gitter

• Block

gruppiert Threads als 3D-Gitter

GPGPU • Threads Programming

besitzten eindeutige ID

nvidia CUDA vs. AMD/ATI Stream

Kernel

Grid

nvidia CUDA | API

Block 0,0 Block 0,1 Block 0,2 Block 0,3

Block 1,0 Block 1,1 Block 1,2 Block 1,3

Anzahl der Threads

Threads per Block x Blocks per Grid

Block 2,0 Block 2,1 Block 2,2 Block 2,3

Block 3,0 Block 3,1 Block 3,2 Block 3,3

Block 3,1

Thread Thread Thread

Thread Thread Thread

Seminar HWS 08/09 by Erich Marth

10


Kernel Typen

__global__

GPU Funktion welche nur vom Host gestartet werden kann

Muss void als Rückgabewert liefern

__device__

GPU Funktion welche nur aus einer anderen

GPU Funktion gestartet werden kann

__host__

Host Funktion welche nur vom Host aus

gestartet werden kann

nur ein Kernel

kann gleichzeitig

ausgeführt werden

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

• Kernel können nur auf GPU Speicher zugreifen

__host__

__global__

__device__

nvidia CUDA | API

HOST

DEVICE

Seminar HWS 08/09 by Erich Marth

11


Kernel Aufruf

kernel(…)

Grid N

Block 0

GPGPU Programming

• cudaStream_t str (OPTIONAL)

grid.x

mehr dazu später

block.x

block.y

block.z

grid.y

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

• dim3 gS (max. 65535 x 65535)

Dimension des Grids (2D)

• dim bS (max. 512 x 512 x 64)

Dimension eines Blocks (3D)

• size_t smem (optional)

Shared Memory pro Block

Seminar HWS 08/09 by Erich Marth

12


Kernel Beispiel

// Kernel Defintion

__global__ void vectorSum(float *a, float *b, float *sum) {

// Index des Threads

int index = blockDim.x * blockIdx.x + threadIdx.x;

sum[index] = a[index]+b[index];

}

// Aufruf im Main Programm

kernelFunc > (A,B)

Identifikation von Threads

GPGPU Programming

dim3 blockDim - Dimension des Blocks

nvidia dim3 blockIdx CUDA - Position vs. AMD/ATI des Blocks im Grid Stream

dim3 threadIdx - Position des Blocks im Thread

nvidia CUDA | API

Seminar HWS 08/09 by Erich Marth

13


Speicher

• Shared fast

Daten, Kommunikation

innerhalb eines Blockes

• Global slow uncached

Daten, Kommunikation

zwischen Blöcken

• Constant slow cached

Texture

GPGPU Programming

Speicher mit

Texture Memory

Sonderfunktionen

Block 0,0

REG

REG

REG

Thread

Thread

Thread 0,0

0,0

0,0

Shared Memory

nvidia CUDA vs. AMD/ATI Stream

Grid

Block 0,1

REG REG

Thread Thread

0,0 0,0

Shared Memory

Global Memory

Constant Memory

Read only - cached

nvidia CUDA | API

Block 0,2

REG

REG

REG

Thread

Thread

Thread 0,0

0,0

0,0

Shared Memory

Seminar HWS 08/09 by Erich Marth

14


Speicher

• Typen

Qualifier* __shared__ __device__ __constant__

nvidia CUDA | API

* benutzt in Kernel Code

• Befehle

Allokation cudaMalloc(void **ptr, size_t bytes)

Speicher setzen cudaMemSet(void *ptr, int value, size_t bytes)

Speicher freigeben cudaFree(void *ptr)

Load/Store Befehle cudaMemCopy( *dst, *src, size_t bytes,

cudaMemcpyKind dir)

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

15


Speicher

Beispiel

float *hostPtr = (float *)malloc(sizeof(float)*SIZE);

// do somthing with data

float *devPtr;

cudaMalloc((void **)devPtr,SIZE);

cudaMemCpy(devPtr,hostPtr,SIZE,cudaMemcpyHostToDevice);

vectorSum(devPtr,10);

cudaMemCpy(devPtr,hostPtr,SIZE,cudaMemcpyDeviceToHost);

cudaFree(devPtr);

free(hostPtr);

// kernel code use shared as input buffer

__global__ void vectorSum(float *A, int sum) {

....

GPGPU Programming

__shared__ int buffer[128];

nvidia CUDA vs. AMD/ATI Stream

}

....

nvidia CUDA | API

Seminar HWS 08/09 by Erich Marth

16


Streams

• Streams - In-Order Processing Queue

• Nebenläufigkeit

CPU/GPU sowie Kernel/MemCpy

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

• Befehle:

Erstellen eines Streams cudaStreamCreate(cudaStream_t *stream)

Status eines Streams cudaStreamQuery(cudaStream_t stream)

Stream syncing cudaStreamSynchronize( cudaStream_t stream )

Stream entfernen cudaStreamDestroy( cudaStream_t stream )

Async Memory Transfer cudaMemcpyAsync( ... , cuadStream_t stream)

Kernel queuing kernel(…)

EXEC

Seminar HWS 08/09 by Erich Marth

17


Streams

GPGPU Programming

WAIT TILL ALL OPERATIONS IN ALL STREAM HAVE COMPLETED

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

ALLOCATE 5 STREAMS

cudaStream_t stream[5];

for(int i=0;i


Syncing

• __syncthreads() device

synchronisiert alle Threads in einem Block

unter Verwendung einer Barriere

verhindert:

RAW - read after write, WAR - write after read, WAW - write after write

• cudaThreadSynchronize() host

blockt bis alle ausstehenden Berechnung abgeschlossen sind

inkl. aller ausstehender Befehle in eventuell vorhandenen Streams

GPGPU Programming

• cudaStreamSynchronize(..) host

blockt bis alle Befehle aus einer bestimmten Queue abgearbeitet sind

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

BARRIERE

Seminar HWS 08/09 by Erich Marth

19


Atomic Operations

GPGPU

unsigned int atomicInc(unsigned

Programming

int* address, unsigned int val)

... nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

• Read-Modify-Write

innerhalb eines Zyklus ohne Unterbrechung, in Global sowie Shared Memory

nur neue Hardware unterstützt Shared Memory

• Befehle

int atomicAdd(int* address, int val)

*adresse = *adresse + val

unsigned int atomicSub(unsigned int* address, unsigned int val)

*adresse = *adresse - 1

if(*adress < val) *adress = *adress + 1

Seminar HWS 08/09 by Erich Marth

20


Beispiel

int main( int argc, char** argv)

{

int *h_a, *d_a;

CUT_DEVICE_INIT();

}

init device to use

size_t memSize = 64 * sizeof(int);

h_a = (int *) malloc(memSize);

cudaMalloc( (void **) &d_a, memSize );

cudaMemcpy( d_a, h_a, memSize, cudaMemcpyHostToDevice );

dim3 dimGrid(8);

dim3 dimBlock(8);

myFirstKernel>( d_a );

cudaThreadSynchronize();

cudaMemcpy( h_a, d_a, memSize, cudaMemcpyDeviceToHost);

GPGPU Programmingfree

resources

cudaFree(d_a);// free device memory

free(h_a); // free host memory

nvidia CUDA vs. AMD/ATI Stream

nvidia CUDA | API

__global__ void myFirstKernel(int *d_a) {

// simple increment global address

atomicAdd(d_a,1);

}

Allocate resources

Copy Data to Device

Setup and call kernel

wait for kernel to finish

Copy Back To Host

Seminar HWS 08/09 by Erich Marth

21


Inhalt

✓ Einführung

- Warum, Vorteile, Motivation

✓ nvidia CUDA

- Überblick, API - Details, Beispiele

• AMD Stream Computing

- Überblick, API - Details, Beispiele

• CUDA vs. Stream Computing

- wesentliche Unterschiede

GPGPU Programming

• CPU vs. GPU

- verw. Systeme, Beispiel, Benchmark-Ergebnisse

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

22


Überblick

• basierend auf BrookGPU

Universität Stanford, C Extension für Stream Computing

http://graphics.stanford.edu/projects/brook

• Weiterentwicklung zu Brook+

High Level Stream Computing Language, CAL als Backend

AMD Stream Computing

• AMD CAL (Compute Abstraction Layer)

low/high-level hardware access

direkte Kommunikation mit der Hardware

GPGPU ACML - AMD Core Programming

Math Library

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

23


Begriffe

• Stream

Datenelemente gleichen Typs, welche parallel verarbeitet werden

• Kernel

Funktion welche auf jedes Element eines Streams angewendet wird

AMD Stream Computing

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

24


Modell

• Kernel

Funktion welche auf jedes Element

eines Streams angewendet wird

• Thread

Ausführung einer Berechnung

auf genau ein Element im Out-Stream

• Domain of Execution

Anzahl der erzeugten Threads

proportional zu #{maxStreams}

GPGPU Programming

N

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Kernel

Input

Stream

WICHTIG:

Die Anwendung skaliert

mit der Anzahl der Element

im Stream

M

Seminar HWS 08/09 by Erich Marth

25


Streams

GPGPU float vector Programming

2D Vektor

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Stream

Sammlung von Datenelementen gleichen Typs welche Parallel

verarbeitet werden

ACHTUNG (BETA):

max. name\{1,3}

Elementanzahl

pro Stream 2 ^ 23 Elemente

Beispiel: float vector 1D Vektor

float vector[2] 1D Vektor of Float2

float vector 3D Vektor

Seminar HWS 08/09 by Erich Marth

26


Stream Befehle

// main methode

float A;

Load float B; Befehl streamRead(dest_stream, source_array)

lädt Daten vom Rechner in das Device

// load resources to device

streamRead(A,aHost);

streamRead(B,bHost);

Store Befehl streamWrite(source_stream, dest_array)

< kernel aufruf >

lädt Daten vom Device auf den Rechner

GPGPU

// write back result

Programming

streamWrite(B,bHost);

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Seminar HWS 08/09 by Erich Marth

27


Kernel Typen

• Basic - Einfachste Variante

Lineare Abbildung aller Eingabe-Streams auf Raster

alle Eingabestreams müssen gleich lange sein

Bsp: Vektor-Addition, Determinante (Down Scale)

kernel

void vektorSum( float v1,

float v2,

GPGPU Programming

out float sum) {

sum = v1 + v2;

nvidia } CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

supports auto.

up and down scaling

x

(

1

) + x

(

2

) = x

(

3

y

y

y

1

2

3

... ... ...

)

Seminar HWS 08/09 by Erich Marth

28


Kernel Typen

• Reduce

Reduktion von Streams um eine Dimension

Bsp: Berechnung der Spalten/Zeilen-Norm

reduce

void rowNorm( float matrix,

GPGPU Programming

reduce float sum) {

sum += matrix;

nvidia } CUDA vs. AMD/ATI Stream

( 1 2 3

AMD Stream Computing | API

) 6

4 5 6 15

7 8 9 24

Seminar HWS 08/09 by Erich Marth

29


Kernel Typen

• Random Access

Beliebiger Zugriff auf die Elemente eines Streams

[ ] - erlauben den Zugriff auf einzelnen Elemente eines Streams

Bsp: Matrix-Transponierung

kernel

void transMatrix(float matrix[][],

out float sum) {

float2 index = indexof(sum).xy;

GPGPU Programming

float2 transIndex = float2(index.y, index.x);

sum = matrix[transIndex];

nvidia } CUDA vs. AMD/ATI Stream

( 1 2 3

4 5 6 ) ( 7 8 9

AMD Stream Computing | API

1 4 7

2 5 8

3 6 9

)

Seminar HWS 08/09 by Erich Marth

30


Kernel Typen

// kernel definition

kernel void copyVector(float a, out float b) {

b = a;

}

// main methode

// stream defs

float A;

float B;

// memcpy

streamRead(A,aHost);

streamRead(B,bHost);

// kernel call

copyVector(A,B);

GPGPU Programming

// copy back

streamWrite(B,bHost);

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Seminar HWS 08/09 by Erich Marth

31


Kernel Tipps

• Modularisierung

GPGPU Programming

Rekursion - nicht erlaubt

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Top-Level Kernel - void als Rückgabe

Subkernels - können Werte zurückgeben

Eingabe Parameter - Streams / Non-Stream Parameter

• Einschränkungen

Pointer - nicht unterstützt

Kernel können keine Stream-Befehle aufrufen

Seminar HWS 08/09 by Erich Marth

32


CAL

• CAL Compute Abstraction layer

• Direkter Hardwarezugriff

- erlaubt direkten Zugriff auf

einzelne Hardwarekomponenten

- bessere Anpassung

an die Hardware möglich

• Erweiterung

der Sprache C/C++

Libraries

API's

GPGPU Programming

CPU CPU

CPU

CPU

CPU

CPU

CPU

GPU

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Stream Application

ACML

Brook+

AMD Runtime CAL

Seminar HWS 08/09 by Erich Marth

33


CAL

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

• Funktionen: prefix: cal

calInit, calShutdown

CALResult wird von allen Funktionen zurückgeliefert

• Datentypen: prefix: CAL

CALuint, CALdevice, CALdeviceinfo

• CAL Compiler: prefix: calcl

Build, Link, Execute gerätespezifischen Code zur Laufzeit aus

calclGetVersion, calclCompile, calclLink

Seminar HWS 08/09 by Erich Marth

34


CAL

• Features:

Device Specific Code Generation

Device Specific Code Optimization

Device Management

Resource Management

Kernel Loading and Execution

Multi-Device Support

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

ISA

IL

CAL Compiler

Instruction Set

Architecture

Intermediate

Language

HD 4800 Firestream HD 2600

Device Specific Code

mit Optimierungsgarantie

Seminar HWS 08/09 by Erich Marth

35


CAL Compiler

const char ilKernel[] = "il_ps_2_0 \n ret_dyn \n end”;

CALobject object = 0;

icalclCompile(&object, CAL_LANGUAGE_IL,

ilKernel, CAL_TARGET_670);

CALimage image = 0;

icalclLink (&image, &object, 1);

calModuleLoad(&module, ctx, image);

....

CALevent event = 0;

icalCtxRunProgram(&event, ctx, entry, &domain);

GPGPU Programming

while(calCtxIsEventDone(ctx, event) == CAL_RESULT_PENDING);

calclFreeObject(object);

calclFreeImage(image);

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Der in IL verfasste Kernel

Übersetzen des Kernels

in optimierten Gerätecode

Linken des

ersten Kernelimages

Laden des Kernels

Starte Kernel

Warten auf Ende

Freigabe der Resourcen

Seminar HWS 08/09 by Erich Marth

36


CAL

• Features:

Device Specific Code Generation

Device Specific Code Optimization

Device Management

Resource Management

Kernel Loading and Execution

Multi-Device Support

GPGPU

Stream

Programming

Application

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

AMD

CAL

Device

Driver Stream

GPU

Seminar HWS 08/09 by Erich Marth

37


CAL Feature

Kernel Loading and Execution

• Asynchrone Operationen

Befehle werden non-blocking ausgeführt

Dazu werden diese an ein Event gebunden

GPGPU Programming

Berechnung: calCtxRunProgram(CALevent *e,...)

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Status prüfen

calCtxIsEventDone(CALcontext ctx, CALevent event)

• Befehle

MemCpy: calMemCpy(CALevent *e,...)

Seminar HWS 08/09 by Erich Marth

38


CAL Feature

Beispiel

// Starte GPU Kernel

CALevent e;

// binde GPU Programm an Event

if(calCtxRunProgram(&e,ctx,func,&rect) != CAL_RESULT_OK)

fprintf(stderr,”Error in run kernel\n”);

// force execution of the kernel

calCtxIsEventDone(ctx,e);

... /// führe weitere Host Anweisungen aus

// blockiere bis GPU Kernel abgeschlossen

while(calCtxIsEventDone(ctx, e) == CAL_RESULT_PENDING) {};

GPGPU Programming

...

nvidia CUDA vs. AMD/ATI Stream

AMD Stream Computing | API

Seminar HWS 08/09 by Erich Marth

39


Inhalt

✓ Einführung

- Warum, Vorteile, Motivation

✓ nvidia CUDA

- Überblick, API - Details, Beispiele

✓ AMD Stream Computing

- Überblick, API - Details, Beispiele

• CUDA vs. Stream Computing

- wesentliche Unterschiede

GPGPU Programming

• CPU vs. GPU

- verw. Systeme, Beispiel, Benchmark-Ergebnisse

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

40


Vergleich

Stream Computing

Status: BETA Plattform: Windows, Linux

GPGPU Programming

- AMD Core Math Library nur auf Anfrage

nvidia CUDA vs. AMD/ATI Stream

CUDA vs. Stream Computing

+ Brook+ schnelle Realisierung von Testimplementationen

+ Auto-Memory Management

+ double precision floating point unterstützt in Hardware

+ CAL: Device Specific Code Generation

- schwieriger, da Alternative-Modelle (CAL, Brook+)

- unvollständige Dokumentation da BETA

Seminar HWS 08/09 by Erich Marth

41


Vergleich

nvidia CUDA

Status: 2.0 final Plattform: Windows, Mac, Linux

+ einheitliches Programmier-Model

+ Low und Highlevel Thread Synchronisation

+ Stream Synchronisation

+ nativer Atomic Operations Support

+ sehr gute Dokumentation

GPGPU

- Manual Memory Management

Programming

- double precision floating point unterstützt in Software

nvidia CUDA vs. AMD/ATI Stream

CUDA vs. Stream Computing

Seminar HWS 08/09 by Erich Marth

42


Inhalt

✓ Einführung

- Warum, Vorteile, Motivation

✓ nvidia CUDA

- Überblick, API - Details, Beispiele

✓ AMD Stream Computing

- Überblick, API - Details, Beispiele

✓ CUDA vs. Stream Computing

- wesentliche Unterschiede

GPGPU Programming

• CPU vs. GPU

- verw. Systeme, Beispiel, Benchmark-Ergebnisse

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

43


Systeme

• Sony Playstation 3 60GB Version

CPU: IBM Cell Cores: 1 PPU + 6 SPU RAM: 256MB OS: YLD 6.0

• Opteron System mit 16 Kernen

CPU: 4x Opteron RAM: 4GB OS: OpenSuse 10.3

• Firestream 9170

Cores: 320 RAM: 2GB GDDR3

GPGPU Programming

• Alle GPU Programme wurde via AMD Brook+ realisiert

nvidia CUDA vs. AMD/ATI Stream

Benchmarks

Seminar HWS 08/09 by Erich Marth

44


Matrixmultiplikation

1024 x 1024

2048 x 2048

4096 x 4096

8192 x 8192

CPU

threaded 2x

CPU

threaded 4x

CELL

PS3 LInux

4 s 2.3 s 0.35 s

36 s 19 s 1.12 s

randomized, double (8 byte)

GPU

0.018 s

0.34 s

0.071 s

1.98 s

Speed Up*

6.7x

9.59x

301 s 161 s ** *** ***

2466 s 1256 s ** *** ***

* Leistungssteigerung vgl. CPU System mit 4 Threads vs. GPU

** PS3 verfügt nur über 256 MB Ram

*** aufgrund des Beta Status nicht testbar

45


Wärmeverteilung

1024 x 1024

2048 x 2048

4096 x 4096

8192 x 8192

5.5 s 2.9 s 0.931 s

22.1 s 11.5 s 3.4 s

89.3 s 46.6 s 12.75 s

randomized, double (8 byte)

CPU CPU CPU

threaded 2x threaded 4x threaded 16x GPU Speed Up*

0.018 s

0.42 s

1.18 s

1.23 s

4.3 s

4.47 s

6.9x

9.3x

10.4x

357.2 s 186.9 s 47.5 s ** **

X s pro 500 Iterationen

* Leistungssteigerung vgl. CPU System mit 4 Threads vs. GPU

** aufgrund des Beta Status nicht testbar

46


Fragen

GPGPU Programming

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

47


Danke

Quellen

Nvidia:

http://developer.download.nvidia.com/compute/cuda/2_0/docs/

NVIDIA_CUDA_Programming_Guide_2.0.pdf

http://developer.download.nvidia.com/compute/cuda/2_0/docs/

CudaReferenceManual_2.0.pdf

AMD Stream Computing:

http://ati.amd.com/technology/streamcomputing/Stream_Computing_User_Guide.pdf

http://ati.amd.com/technology/streamcomputing/Stream_Computing_Overview.pdf

GPGPU Supercomputing: Programming

http://www.gpgpu.org/sc2008/

nvidia CUDA vs. AMD/ATI Stream

Seminar HWS 08/09 by Erich Marth

48

More magazines by this user
Similar magazines