6. Frameworks im Überblick
C ++ 11
C ++
C
Device
Framework
CUDA
C++
AMP
DirectX
AMDTreiber
TDD
WDDM
Thrust
C++-
Wrapper
Library
OpenCL
Bolt
Intel
AMD
7. 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
22. P: Elemente
C: Keine
„embarassingly parallel“
A: Granularität
CPU vs. GPU
Großer Unterschied!
M:
TBB, OpenMP, CUDA, etc.
Map mit PCAM
23. Beispiele
Durchschnitt, Smoothing
PDEs
P, A, M wie Map
C: Nachbarschaft
Optimierung
Speicherzugriffe und Cache
Berechnungen speichern
Stencil mit PCAM
25. Initialisiere Wärmequelle heat
prev := 0
Für alle Iterationen
Addiere Wärmequellen prev += heat
current := stencil(prev)
Tausche prev und current
Ablauf
26. 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 …
27. Obfuscation
Aus Wilt „The CUDA Handbook“, S. 218
„Index-
Schlacht“
OptimiertNachteil: Speicherorganisation
fest verdrahtet
32. 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 -- -- --
39. Computation Bound
Alle Prozessoren 100% ausgelastet
Memory Bound
Bandbreite zum Speicher voll ausgelastet
Latency Bound
Warten auf die Daten
Arten der Auslastung
40. NVVP sagt zu stencil()
Arithmetische
Intensität 1/5
41. Nicht optimal
Arithmetische Intensität niedrig
#Berechnungen / #Speichertransfers
Möglichkeiten
Mask()
Textur-Speicher ausprobieren
Stencil()
Zwischenspeichern im Shared-Memory
Fazit Single GPU
45. 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)
46. Host (wie bisher)
Wärmequellen
Endergebnis
Benötigt pro GPU
Buffer für prev und current
Heat-Buffer (Ausschnitt)
Datenstrukturen (Multi)
47. cudaGetDeviceCount(int* count)
Ermittelt Anzahl der Devices
cudaGetDeviceProperties(cudaDevice
Prop* prop, int device)
Eigenschaften des Devices
cudaSetDevice(int device)
Setzt Device für aktuellen Thread
Betrifft alle folgenden cuda*-Funktionen
Multi-GPU mit CUDA
48. 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
73. 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?
74. 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
75. Grafikkarte x16
CPU hat 40 Lanes
=> max. 2 x16 + 1x8
bis zu 4 x8
PCIe
D2D
76. 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
83. Aktuelle GPUs können gleichzeitig
Kernel, 1 Kopie hin u. 1 Kopie zurück
Streaming
84. …
Für alle Iterationen
Für jede GPU
Berechne nur den Halo („Spezialkernel“)
Kopiere Asynchron zu Nachbarn
Berechne Teil ohne Halo
…
Modifizierter Ablauf (Multi)
86. 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?
87. 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
101. Context wird mit vector<> angelegt
Für jedes Device eine Queue
Single-Context, Multi-Device
102. 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
103. 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
104. Von Single- zu Multi-GPU
1. Partionierung einführen
2. Vervielfachung der Datenstrukturen
3. Kernel erweitern
Mit Offsets und weiteren Extents
Zusammenfassung
105. 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
110. 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
joern@dinkla.com
Hinweis der Redaktion
TSUBAME-KFC, Tokyo Institute of Technology, KFC = Kepler Fluid Cooling, 4,5 GFLOPS/watt
http://blogs.nvidia.com/blog/2013/11/19/japans-oil-cooled-kfc-tsubame-supercomputer-may-be-headed-for-green500-greatness/
Einsatzszenarien
Tablet
Notebook
Desktop
Server
Server-Farm/Cluster
Superrechner
Lokal/Remote (Cloud bei Amazon z. B.)
ab 10x speedup enabler
Realistisch so ca. 10x Speedup
Wenn größere Werte angegeben werden, oft wg. denormals oder SFU-Funktionen
Floating Point
Denormals at full speed SM 2.0, CPU 100x slower
"Wie werde ich Optimierungsexperte?"
„Enabler“ Rewrite der Software kann sich lohnen
there ain’t no such thing as a free lunch
Robert Heinlein. The Moon is a harsh mistress. 1966.
Verweis auf Optimierung später … “das gucken wir uns noch genauer an”…
SLI-Band, spezielle Hardware notwendig
ab 10x speedup enabler
Realistisch so ca. 10x Speedup
Wenn größere Werte angegeben werden, oft wg. denormals oder SFU-Funktionen
Floating Point
Denormals at full speed SM 2.0, CPU 100x slower
"Wie werde ich Optimierungsexperte?"
„Enabler“ Rewrite der Software kann sich lohnen
there ain’t no such thing as a free lunch
Robert Heinlein. The Moon is a harsh mistress. 1966.
Verweis auf Optimierung später … “das gucken wir uns noch genauer an”…
Abstraktion der gleichen Hardware, daher alle ähnlich
CUDA Runtime und CUDA Driver
C++ Accelerated Massive Parallelism
Kein C++ 11, nur VS 2012
TODO Bei AMP sind die Kernel doch schon reduziert und kein vollständiges C++
C++ AMP, Prototyp Shevlin Park, Übersetzung von AMP zu OpenCL, aber nur Proof of Concept bzw. Prototyp, wird von Intel nicht weiter verfolgt
OpenCL „Kommiteesprache“
C++ AMP wird zu HLSL kompiliert (Dirext X Shader-Sprache)
Ian Foster “Designing and Building Parallel Programs”
aus den 90ern
To embarass s.o. – jemanden in Verlegenheit bringen, peinlich
Ein bischen dezenter in der Farbgebung
„Ein weites Feld“,
Daumenregel: Überall da, wo es C gibt, gibt es auch Optimierungsmöglichkeiten
Den Wald vor lauter Index-Berechnungen nicht sehen …
Mit „Indizes“ jemanden in den Wahnsinn treiben.
Oftmals ist es auch sinnvoll zwischen Extension und Index zu unterscheiden
Pinned by C++ AMP: staging buffer
Thread-Block-Größe
Vielfaches von 32/64
Typischerweise für 1D, 2D, 3D
Das sync ist nicht unbedingt notwendig hier, nur wenn man daten in der schleife nach aussen gibt.
Jeder Thread hat eigenen Pfad
Complex algorithms tend to be harder to parallelize, are more susceptible to divergence, and offer less flexibility when it comes to optimisationParallel programming is often less about how much work the program performs as it is about whether that work is divergent or not. Algorithmic complexity often leads to divergence, so it is important to try the simplest algorithm first.
http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/
(*) kostet, unterschiedliche Versionen des SDKs für Xeon Phi und die anderen
„Volle Pulle“
„Die Straßen sind voll“
„Wo bleibt das Taxi nur?“
Bei mask sieht es ähnlich aus
Redundantes Lesen
cudaDeviceSynchronize()
cudaDeviceReset()
Betrifft alle. Hier ist es z. B. wichtig, dass der Kerne
Einschränkungen NVIDIA
Nur NVIDIA, nur neuere
Nicht bei Windows und WDDM-Treiber
Ausnahmen am Anfang und Ende gibt es nur jeweils einen Overlap
Bei einer Kopie, z. B. der Hitze von add_heat()
Erinnern sie sich noch an die Folie, bei der ich Extent2 motiviert habe? Die mit den vielen Berechnungen
Spätestens hier wird es einfach übersichtlicher mit Extent2
GPU i kopiert aus dem „Inner“ heraus den Overlap ans Ende von i-1 und an den Anfang von i+1
Immer Extent2 und Pos2 / Offset
CPU, Chipsatz, externer Controller
(*) etwas weniger
z. B. bei Intel im IOH 16 lanes, 40 lanes ( 28 lanes bei 5820) für 3.0, UND 8 2.0 lanes vom chipsatz, aber intern genutzt, daher nur x4 nutzbar
AMD FM2+ 20 lanes, aber nur 16 3.0, 4 lanes vom chipsatz, insg. 8 lanes für peripherie
QPI 40 lanes
interne PCIe controller
Siehe auch http://www.pcgameshardware.de/Mainboard-Hardware-154107/Specials/PCI-Express-x16-gegen-x8-1136576/
Externe controller
- direkt, splitter, switches
PCI Express Switches von PLX
Hier könnte auch eine weitere CPU an den IOH
Lanes nicht mehr auf dem Chipsatz nur im Prozessor, daher kann man die Karten nur mit zwei Prozessoren nutzen
Parallele Übertragung
„no contention“
Bei odd-even, even-odd nicht der Fall