Folien des Vortrags auf der parallel 2014. Neben den Grundlagen der Architektur von Grafikkarten werden die Besonderheiten bei der Parallelisierung von GPU-Kerneln erklärt. Anhand des Werkzeugs "Guided Application Analysis" des Nvidia Visual Profiler werden Tipps und Tricks für die Optimierung gegeben und der theoretische Hintergrund erläutert. Es wird gezeigt, wie mit Streaming und dem Einsatz von mehreren GPUs (Multi-GPU) Systeme besser ausgelastet werden können. Der Referent stellt hierbei Klassen und Hilfsmittel vor, die er bei der Projektarbeit im Bereich GPU Computing in den letzten fünf Jahren erlernt hat.
3. Angekündigt
„In diesem Vortrag wird ein sequenzielles
Programm schrittweise in ein optimiertes
massiv-paralleles GPU-Programm überführt…“
Aber
CUDA 6.0
Optimierungsergebnisse Kepler
Didaktisch nicht geeignet
Zu viel Fachlogik, zu wenig GPU
Daher
mehrere kleine Programme, aber mehr GPU
Klärung
4. Folien und Sourcecode gibt es
unter ...
http://dinkla.net/parallel2014
Download
10. Z. B.
NVIDIA Tesla
AMD FirePro
Eigenschaften
ECC Speicher
Größerer Speicher
Bessere Double-Performance
Kein Monitor-Anschluss
Keine Kühlung
Auch spezielle Karten
11. C ++ 11
C ++
C
Frameworks
Device
WDDM
Framework
CUDA
OpenCL
C++
AMP
DirectX
AMDTreiber TDD
Thrust C++-
Wrapper
Library
12. CUDA
⊖ Benötigt NVIDIA-Hardware
⊕ Teilweise C++
⊕ Am meisten benutzt
C++ AMP
⊖ Benötigt Windows/DirectX, Einschränkungen
⊖ Noch „jung“, keine erprobten Libraries
⊕ C++ 11
OpenCL
⊖ Geringer Abstraktionsgrad, C99
⊖ Nicht so viele Libraries wie bei CUDA
⊕ Apple, Intel, AMD
Einschränkungen
13. Schnelle erste Erfolge
2x – 5x Speedup
Dann wird es schwieriger …
Wissen über die Hardware
notwendig
Speedup
2 3 4 5 6 7 8 9 10 11 …
14. Schneller, Größer, Besser
Nur wenn notwendig!
Parallelisieren?
1080p Ultra HD / 4K720p576p480p
15. Nicht das Rad neu erfinden
„best practices“
„think parallel“
Empfehlung:
„Structured Parallel Programming“
Michael McCool et. al.
Intel-lastig, Cilk Plus, TBB
Parallele Patterns
20. Bolt
Ähnlicher Abstraktionsgrad
Leider nur für AMD
Projekt nicht aktiv
C++-Bindings
C++ (Nicht C++ 11)
Siehe „Schneller Einstieg in OpenCL
mit C++-Bindings“
OpenCL
21. Abstraktion wichtig für Fortschritt
Java, JVM, Web-Frameworks mit Ruby
Rapid Prototyping
Aber:
Hintergrundwissen bei GPU-Computing
notwendig!!!
Was ist hinter dem „Vorhang“ des APIs?
Die beiden Programme haben einen
Unterschied! Wer findet ihn?
Schöne neue Welt
26. Host- und Device-Buffer
Versionierung der beiden Seiten
get_host()->incr_version()
Aktualisierung je nach Version
update_host()
update_device()
CUDA 6: Unified Memory
BufferPair
Host
Buffer
Device
Buffer
27. 1. Übergebe ID als Parameter
2. Hole Daten anhand ID
3. Verarbeitung
4. Speichere Daten anhand ID
SPMD / SIMT
28. Kernel ruft Funktion op auf
Index-Berechnungen extern
Back to the Basics
30. Grund: Kernel in der Praxis
Aus Wilt „The CUDA Handbook“, S. 218
„Index-
Schlacht“
OptimiertNachteil: Speicherorganisation
fest verdrahtet
31. Vor dem Kernel-Aufruf
Wechsel der Abstraktionsebene
Host zu Device
Von C++-Datenstrukturen zu Device-Pointern
Aufruf des Kernels
Kernel-Aufruf
36. Ein Thread-Block wird einem
festen SM zugewiesen
Zerlegung eines Blocks in Warps
32 Threads pro Warp
Kleinste Scheduling-Einheit
Thread-Block-Größe
Vielfaches von 32
Grund: Warp
38. Computation Bound
Alle Prozessoren 100% ausgelastet
Memory Bound
Bandbreite zum Speicher voll
ausgelastet
Latency Bound
Warten auf die Daten
Arten der Auslastung
39. Sortiert nach Optimierungspotential
NVVP‘s Guided Analysis
Hier!
41. Host
Verschiedene Speicher
CPU 1
Core
L1 / L2
Core
L1 / L2
L3 Cache
Global Memory
Bus
GPU
Global Memory
Constant Texture
Prozessor (SM)
Local / Shared / L1
Registers
C CC C
L2 Cache
8/168-20
192/
288
1600
8000
Mem. Ctrl.
43. Einfaches Beispiel,
überraschendes Ergebnis
128 Optimum, aber 192 Kerne
„Viel hilft viel“ stimmt hier nicht
Kernel-Konfiguration
Anzahl der Threads = 32*k
Benchmarks notwendig!
Fazit
44. Lesezugriffe und Schreibzugriffe
Anzahl, Datenmenge, Zugriffsmuster
Operationen
Komplexität pro Element / Granularität
O(1)
O(log n)
O(n)
O(n^2)
In der Regel memory bound aber evtl.
computation bound
Performance einer Map
48. Max. 16 Thread-Blöcke „resident“ (*)
Einer aktiv (dunkelgrün)
Ready to go (hellgrün)
Wartend auf Speicher (orange)
Z. B. Occupancy 5/8 = 62.5%
Latency Hiding
W0SMX W1 W2 W3 W4 -- -- --
49. Berücksichtige (Werte für CC 3.5)
Max Threads pro Block 1024
Max Blocks pro SMX 16
Max Warps pro SMX 64
Max Threads pro SMX 2048
Anzahl 32-bit Register pro SMX 64K
Max Anzahl Register pro Thread 255
Max Shared Mem pro SMX 48 KB
Max Shared Mem pro Block 48 KB
Occupancy ist komplex
55. ABER:
Laut Werbung: 3977 GFLOPS (GTX 780)
Volle Auslastung einer GPU
Alle Kerne auf allen SMX bearbeiten eine
FMA, d.h. warten nicht auf den Speicher
FLOPS = Anzahl der Kerne * Takt * 2
780er: 2304 * 863 Mhz * 2
FMA („Fused multiply-add“) zählt als zwei
Operationen
Theoretisches Maximum
63. Single Instruction!!!
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
75. Aufwand
Umstellen des Codes
Einfügungsreihenfolge
HyperQ ab CC 3.5
Bei CC<3.5
Achtung Performance
Auf richtige Reihenfolge achten
Siehe Literatur
Synchronisation über Events
Streaming
76. Einsatz mehrerer GPUs
Explizite Auswahl des Devices
CUDA: cudaSetDevice()
OpenCL: clCreateContext()
C++ AMP: accelerator_view als
Argument zu parallel_for_each
Multi-GPU
77. Kernel und Speicher auf gleichem
Device!
=> Partionierung / Strategie
Datenstruktur für Zuordnung
map<partition, device>
Vorsicht bei Bibliotheken
Z. B. Thrust
Bisher nicht komfortabel gelöst
Anforderungen
79. Steuerung durch den Host
Möglichkeiten
1. Ein Thread füllt alle Streams
2. Pro GPU ein Thread für zwei
Streams
3. Pro Stream ein Thread
Performance ist systemabhängig
Multi-GPU
87. Heuristiken, keine Patentrezepte
Bisher Unterschiede bei jeder
Karten-Generation
Benchmarks sind Pflicht!
Neugierde auch!
Literatur ist inzwischen reichlich
vorhanden
Fazit
88. Einsteiger
„CUDA by Example“
Sanders, Kandrot
Fortgeschritten
CUDA Programming
Cook
CUDA Handbook
Wilt
CUDA
89. Spezialisten
GPU Computing Gems
„Jade“ und „Emerald“
Doku
„Programming Guide“
„Best Practices Guide“
Web
CudaZone bei nvidia.com
Parallel Forall (Blog)
Dokumentation docs.nvidia.com
CUDA
90. Einsteiger/Fortgeschritten
„… in Action“
„… Programming Guide“
„Heterogenous Computing
with OpenCL“
Web
Khronos
AMD‘s OpenCL Zone
Apple / Mac OS X
OpenCL
91. Bisher nur ein Buch
„C++ AMP“
Web
Microsoft
Intel‘s Prototyp/PoC „Shevlin Park“
C++ AMP
92. Bin beide Tage vor Ort
Sprechen Sie mich an!
joern@dinkla.com
Ansonsten
Happy GPU-Computing!
Fragen ?
93. Freiberuflicher Dipl.-Inform.
Schwerpunkte
Parallele Systeme
C++ und Java/JVM
GPU-Computing
CUDA, OpenCL, C++ AMP
Weitere Informationen
http://www.dinkla.net
Last but not least