110
Multi-GPU-Computing: Eins, zwei, drei, ganz viele Jörn Dinkla para//el 2015 Karlsruhe, 22. 4. 2015 Version 0.1

Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Embed Size (px)

Citation preview

Page 1: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Multi-GPU-Computing:Eins, zwei, drei, ganz viele

Jörn Dinkla

para//el 2015

Karlsruhe, 22. 4. 2015

Version 0.1

Page 2: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Tablet, PC, Großrechner, Cloud, Spielkonsole,

Autos …

GPU-Computing ist überall

Page 3: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Schnelle erste Erfolge

2x – 5x Speedup

Dann wird es schwieriger …

Oft sind 10x drin

Speedup

2 3 4 5 6 7 8 9 10 11 …

„Enabler“

Page 4: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Bis zu 16 GPU pro Knoten

Abhängig von

Mainboard, CPU, Chipsatz, PCIe-Controller

Multi-GPU

Page 5: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

2 GPUs

3 GPUs

Erreichbar? Amdahl‘s Gesetz?

X-facher Speedup?

4 6 8 10 12 14 16 18 20

6 9 12 15 18 21 24 27 30

Page 6: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Frameworks im Überblick

C ++ 11

C ++

C

Device

Framework

CUDA

C++

AMP

DirectX

AMDTreiberTDD

WDDM

Thrust

C++-

Wrapper

Library

OpenCL

Bolt

Intel

AMD

Page 7: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

CUDA

⊕ Am meisten verbreitet

⊕ C++ 11

⊖ nur NVIDIA-Hardware

C++ AMP

⊕ C++ 11

⊖ Einschränkungen wegen DirectX (bisher)

⊖ geringe Verbreitung

OpenCL

⊕ Apple, Intel, AMD

⊖ Geringer Abstraktionsgrad, C99

⊖ Nicht so viele Libraries wie bei CUDA

Vor- und Nachteile

Page 8: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

1. Partitioning

2. Communication

3. Agglomeration

4. Mapping

Siehe http://www.mcs.anl.gov/~itf/dbpp/

PCAM-Methodik

Page 9: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

… und parallele Datenstrukturen

… und partitionierte Datenstrukturen

Aufgabenstellung ähnlich

Egal ob Multi-

-CPU,

-Core

oder -GPU

Parallele Algorithmen

Page 10: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Speicher und Synchronisation

Page 11: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

1 GPU, Daten passen

Page 12: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Partionierung u. „Swapping“ erforderlich

1 GPU, Daten passen nicht

Page 13: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Partionierung erforderlich

2 GPUs, Daten passen

Szenario für

den Vortrag

Page 14: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Partionierung u. „Swapping“ erforderlich

2 GPUs, Daten passen nicht

Page 15: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Listen, Arrays

2D: Ebenen, Bilder

3D: Volumen

Ganz

Als Vektor/Liste von Ebenen

Grids, Gitter

Einfach zu partitionieren

Regelmäßige Datenstrukturen

Page 16: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Regelmäßige Datenstrukturen

Teilung nach Anzahl Elemente

x y*z x/2 * y

y z x*y/2

z 2 x*y*z/2

Kopie

Page 17: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Bäume

Teilbäume als Partitionen

Graphen

Zusammenhangskomponenten

Klein genug? Gleich groß?

Unregelmäßige Datenstrukturen

Page 18: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Graph Partitioning / Clustering

Aufteilung gemäß Kostenfunktion

Im allg. NP vollständig

Minimale „cuts“

Social Networks und Big Data

Apache Spark und GraphX

Kernighan-Lin, 𝑂(𝑛3)

Buluc et. al. „Recent Advances in GP“ 2013

Unregelmäßige Datenstrukturen

Page 19: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Homogen (Gleiche GPUs)

Gleiche Arbeit

Inhomogen (Unterschiedliche GPUs)

Messen und gewichten

Wie bei CPUs

Work-Balancing / Job-Stealing

Scheduling-Theory

Divisible Load Theory

Scheduling

Page 20: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Nicht das Rad neu erfinden!

„best practices“

„think parallel“

Tip

McCool et. al.

„Structured Parallel Programming“

Intel-lastig, Cilk Plus, TBB

Parallele Patterns

Page 21: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Parallele Patterns

Siehe http://www.parallelbook.com/

Page 22: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

P: Elemente

C: Keine

„embarassingly parallel“

A: Granularität

CPU vs. GPU

Großer Unterschied!

M:

TBB, OpenMP, CUDA, etc.

Map mit PCAM

Page 23: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Beispiele

Durchschnitt, Smoothing

PDEs

P, A, M wie Map

C: Nachbarschaft

Optimierung

Speicherzugriffe und Cache

Berechnungen speichern

Stencil mit PCAM

Page 24: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Wärmeleitungsgleichung in 2D

Stencil

o[x,y] += c* ( i[x-1,y] + i[x+1,y]

+ i[x,y-1] + i[x, y+1]

- 4 * i[x,y] )

Beispiel: Heat-Simulation

Page 25: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Initialisiere Wärmequelle heat

prev := 0

Für alle Iterationen

Addiere Wärmequellen prev += heat

current := stencil(prev)

Tausche prev und current

Ablauf

Page 26: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Daten

Buffer(float) für Wärmequelle

Buffer(float) für prev und current

Kernel

add_heat() bzw. mask()

stencil()

Optional

Buffer(uchar4)

Kernel für Umwandlung

Zu implementieren …

Page 27: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Obfuscation

Aus Wilt „The CUDA Handbook“, S. 218

„Index-

Schlacht“

OptimiertNachteil: Speicherorganisation

fest verdrahtet

Page 28: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Größe / Extension

width, height

index(x,y)

in_bounds(x,y)

in_bounds_strict(x,y)

Extent2

0 1 2 3

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

1

2

3

Page 29: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Stencil-Kernel (CUDA 7.0)

Page 30: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Vor Kernel-Aufruf

Wechsel der Abstraktionsebene

Host zu Device

Von C++-Datenstrukturen zu Device-Pointern

Aufruf des Kernels

Kernel-Aufruf

Page 31: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Basis BaseBuffer

HostBuffer

Unpinned (C++)

Pinned (CUDA, nicht swapbar)

Lokaler Speicher (NUMA)

DeviceBuffer (CUDA)

ManagedBuffer (CUDA)

Buffer

Page 32: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

GPU besteht aus mehreren SM/CU

Thread-Block wird festen SM zugewiesen

Warp / Wavefront

Kleinste Scheduling-Einheit

32 bei NVIDIA, 64 bei AMD

Occupancy

Warps und Wavefronts

W0SM* W1 W2 W3 W4 -- -- --

Page 33: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Thread-Block (Work group, tile)

Performance, abhängig von Hardware

Grid (NDRange)

Beispiel

Daten 8x8

Grid 2x2

Block 4x4

Grid = Data/Block

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

Daten, Pixel, Voxel Grid

Page 34: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

kernel<<<g, tb, sm, s>>>(params)

Kernel-Konfiguration

dim3 Grid g

dim3 Thread-Block tb

Größe des Shared-Memory sm

cudaStream_t s

Oft abhängig vom Extent2

CudaExecConfig(Extent2& e)

CudaExecConfig

Page 35: Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Page 36: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

mask() / add_heat()

Page 37: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Single Instruction Multiple Threads!

Mask-Bit für jeden Thread im Warp

SIMT - Divergenz

0 1 2 3

int tid = treadIdx.x;

if (tid < 2) {

call_expensive_function()

} else {

call_expensive_function2()

}

Warps Code

Page 38: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

CUDA

Nsight (Visual Studio, Eclipse)

nvvp, Visual Profiler (Eclipse)

Kommandozeile nvprof

OpenCL

Intel Vtune (*)

AMD CodeXL

C++ AMP

Visual Studio 2013

Concurrency Visualizer

Profiling

Page 39: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Computation Bound

Alle Prozessoren 100% ausgelastet

Memory Bound

Bandbreite zum Speicher voll ausgelastet

Latency Bound

Warten auf die Daten

Arten der Auslastung

Page 40: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

NVVP sagt zu stencil()

Arithmetische

Intensität 1/5

Page 41: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Nicht optimal

Arithmetische Intensität niedrig

#Berechnungen / #Speichertransfers

Möglichkeiten

Mask()

Textur-Speicher ausprobieren

Stencil()

Zwischenspeichern im Shared-Memory

Fazit Single GPU

Page 42: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Partitionierte Map

Map mit Multi-GPU

Page 43: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

„Overlap“

Stencil mit Multi-GPU

Page 44: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Halo

Ghost Cells

„Overlap“

Iterierter Stencil

Page 45: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Initialisiere Wärmequelle heat

Für jede GPU

Initialisiere Buffer prev und current

Kopiere Teil von heat auf‘s Device

prev := 0

Für alle Iterationen

Für jede GPU

Addiere Wärmequellen prev += heat

current := stencil(prev)

Tausche prev und current

Kopiere Halo/Ghost Cells zu Nachbarn

Kopiere Ergebnisse aller GPUs auf Host

Ablauf (Multi)

Page 46: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Host (wie bisher)

Wärmequellen

Endergebnis

Benötigt pro GPU

Buffer für prev und current

Heat-Buffer (Ausschnitt)

Datenstrukturen (Multi)

Page 47: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

cudaGetDeviceCount(int* count)

Ermittelt Anzahl der Devices

cudaGetDeviceProperties(cudaDeviceProp* prop, int device)

Eigenschaften des Devices

cudaSetDevice(int device)

Setzt Device für aktuellen Thread

Betrifft alle folgenden cuda*-Funktionen

Multi-GPU mit CUDA

Page 48: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Jeder Thread hat CUDA-Kontext

Dieser speichert aktuelle GPU

Kernel

Nur Speicher auf gleichem Device!

Vorsicht bei Bibliotheken

Z. B. Thrust

Multi-GPU mit CUDA

Page 49: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Partition, CudaPartition

Page 50: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

GPU

Page 51: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Explizit einschalten

cudaDeviceCanAccessPeer(&i,d,e)

cudaDeviceEnablePeerAccess(e,0)

Einschränkungen

Nicht Windows u. WDDM

Peer-to-Peer-Kopien

D2D

Page 52: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

2D-Partition

Page 53: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

2D-Partition auf Device

Page 54: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

mask()-Kernel

Verschiedene Extents für Quelle und Ziel

mask()

Page 55: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Erinnerung: mask()

Page 56: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

mask() mit Offset

Page 57: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Pos2

Page 58: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Mit_overlap zu mit_overlap

Kernel nur für inneren Bereich aufrufen

stencil()

Page 59: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Erinnerung: stencil()

Page 60: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

stencil() mit Offset

Page 61: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Multi-GPU in CUDA

Page 62: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Halo vergessen?

Page 63: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Kopieren der Halos

Page 64: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

XExtent2

Page 65: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Region2

Page 66: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Init in CUDA

Page 67: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Update in CUDA #1

Page 68: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Update in CUDA #2

Async!

Page 69: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Wichtig: cudaDeviceSynchronize() parallel

Analyse mit NVVP / Nsight

Orange seq.

Orange par.

Page 70: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Aktuelle Hardware

Intel i7-5930K, 4,0 Ghz

16 GB DDR4 RAM, 2,4 Ghz

2x NVIDIA GTX 970, Standard-Clocks

2x 16x PCIe 3.0

OS

Windows 7 bzw. Ubuntu 14.10

Benchmark Testsystem

Page 71: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Speedups

10x

Page 72: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Speedups Multi-GPU

1,955x

Page 73: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

1,955 Speedup bei 2 GPUs

Und was bei 3, 4 oder mehr Karten?

Problem:

PCIe-Bus skaliert nur begrenzt

Bandbreite ist begrenzt

Anzahl der Geräte ist begrenzt

Und bei mehr GPUs?

Page 74: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Lane ist 1 bit, full duplex

Punkt-zu-Punkt Verbindung

1,2,4,8,12 oder 16 Lanes

Geschwindigkeiten

2.0: pro Lane 500MB/s, max. 8 GB/s

3.0: pro Lane 1GB/s, max. 16 GB/s (*)

Controller

Hat max. Anzahl Lanes

PCIe

Page 75: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Grafikkarte x16

CPU hat 40 Lanes

=> max. 2 x16 + 1x8

bis zu 4 x8

PCIe

D2D

Page 76: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Anzahl PCIe-Slots auf Mainboard

Anzahl Lanes des PCIe-Controller

Anzahl der Switches / IOHs

4, 8 oder 16 GPUs

Wichtig ist die Bandbreite nicht zu überladen

Praxiserfahrung:

3 GPUs waren bei vielen Kopien schneller

als 4 GPUs

Anzahl der GPUs

Page 77: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

PCIe Switch

D2D D2D D2D

Page 78: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Kein D2D über QPI

NUMA

D2D D2D

Page 79: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Rechts-Links

„Rechts“ Erst Kopie von g zu g+1

„Links“ Dann von g zu g -1

Kopieren der Halos

Page 80: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

PCIe-Bus

Page 81: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Für alle Iterationen

Für jede GPU

Addiere Wärmequellen prev += heat

current := stencil(prev)

Tausche prev und current

Kopiere Halo/Ghost Cells zu Nachbarn

Ablauf (Multi)

Page 82: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Kopieren der Halo‘s #2

Page 83: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Aktuelle GPUs können gleichzeitig

Kernel, 1 Kopie hin u. 1 Kopie zurück

Streaming

Page 84: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Für alle Iterationen

Für jede GPU

Berechne nur den Halo („Spezialkernel“)

Kopiere Asynchron zu Nachbarn

Berechne Teil ohne Halo

Modifizierter Ablauf (Multi)

Page 85: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Kopieren der Halo‘s #2

Code-Komplexität

vs. Performance

Page 86: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Abhängig von Implementierung und Hardware

Wie groß sind die Halos?

Lässt sich die Kopie hinter dem Kernel

verstecken?

Ab wie vielen GPUs ist der Bus ausgelastet?

Gibt es Stau („contention“) auf dem Bus?

Lohnt sich das?

Page 87: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Viele melden Erfolge …

Linearer Speedup

http://on-demand.gputechconf.com/gtc/2015/posters/GTC_2015_Computational_Physics_03_P5122_WEB.pdf http://on-demand.gputechconf.com/gtc/2015/presentation/S5585-Wei-Xia.pdf

Page 88: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

2016 Pascal

4 „Connections“ per GPU

Jede 20GB/s peak, 16GB/s praktisch

US DoE, Summit 2017 150-300 PetaFLOPS

NVLINK

Page 89: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

C++ AMP

Daten: array, array_view

Kernel: parallel_for_each

Page 90: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Single GPU mit AMP

Page 91: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

DoubleBuffer<T>

Page 92: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Single GPU mit AMP #2

Page 93: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

restrict(amp)

Extent2 hat schon __device__

Extent2AMP

Page 94: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Single GPU mit AMP #3

x, y: andere

Reihenfolge!

Page 95: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

GPU heißt „accelerator“

accelerator_view ist logische Sicht

Argument zu parallel_for_each

Multi-GPU mit C++ AMP #1

view

Page 96: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

array_view logische Sicht auf ein array

array<float> name(size, view)

Multi-GPU mit C++ AMP #2

Page 97: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

„D2D“-Kopien

Aber:

Über Host

Nicht parallel zu parallel_for_each

Multi-GPU mit C++ AMP #3

Page 98: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

OpenCL-stencil()

Kein

Extent2

Kein C++

11

Page 99: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

OpenCL und C++Bindings

Page 100: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Platform

Device

Context

Program

Kernel

Buffer, Image

CommandQueue

Event

Übersicht OpenCLPlatform

Device

Page 101: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Context wird mit vector<> angelegt

Für jedes Device eine Queue

Single-Context, Multi-Device

Page 102: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

OpenCL-Objekte „shared“

MemObjects, Programs, Kernels

MemObjects brauchen explizite Kopie

Kein D2D

Support für Partitions / Multi-GPU

Offsets für Kernel und Kopien

SubBuffer

Single-Context, Multi-Device

Page 103: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Pro Device einen Context

Alles separat und redundant

Evtl. einfacher zu programmieren

Scatter/Gather/Broadcast statt SubBuffer

Aufpassen bei der Datenhaltung

Einfache Erweiterung

Multi-Node oder heterogenes System

Multi-Context & Multi-Device

Page 104: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Von Single- zu Multi-GPU

1. Partionierung einführen

2. Vervielfachung der Datenstrukturen

3. Kernel erweitern

Mit Offsets und weiteren Extents

Zusammenfassung

Page 105: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Parallele Algorithmen

… und partitionierte Datenstrukturen

Hardware

PCIe-Problematik

Kompetenter PC-Hersteller notwendig

Fazit

Gute Speedups möglich

Wenn Halo-Kopien klein

und/oder hinter Kernel versteckt

Skaliert wegen PCIe nur begrenzt

Fazit

Page 106: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Multi-Node

Page 107: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Das gleiche Partitionierungsproblem

Kommunikation zwischen Nodes

Kein Shared-Host-Memory mehr

MPI_Send()

MPI_Recv()

GPU-spezifische Erweiterungen

OpenMPI, MVAPICH2

Multi-Node mit MPI

Page 108: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Titan

18688 Opterons und 18688 Tesla K20X

Nr. 2 in Top 500

Multi-NodeNur am Rande

Page 109: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Folien

http://dinkla.net/parallel2015

Sourcecode

https://github.com/jdinkla/parallel2015_gpuco

mputing

Organisatorisch

Page 110: Multi-GPU-Computing: Eins, zwei, drei, ganz viele

Schwerpunkte

Parallele Systeme

C++ und Java/JVM

GPU-Computing

CUDA, OpenCL, C++ AMP

Big Data, BI, Data Science

http://www.dinkla.com

Last but not least

Fragen?

Sprechen Sie mich

an oder

[email protected]