Data Parallel C++ – Mastering DPC++
Zusammenfassung
„Data Parallel C++: Mastering DPC++ for Programming of Heterogeneous Systems using C++ and SYCL” (Reinders, Ashbaugh, Brodman, Kinsner, Pennycook, Tian; Apress, Open Access 2021) ist das Referenzbuch zu DPC++, Intels Open-Source-Compiler (github.com/intel/llvm) auf Basis des offenen Khronos-Standards SYCL plus Erweiterungen. Es lehrt C++-Datenparallelität für heterogene Systeme (CPU/GPU/FPGA); kommerzielle Varianten liegen in den Intel-oneAPI-Toolkits.
Inhalt
Grundkonzepte
- Single-Source: Host-Code und Device-Kernels in einer Translation Unit; Host muss C++17 unterstützen.
- Queues und Actions:
queueist die einzige Verbindung zum Device; zwei Aktionsarten – Code (single_task,parallel_for,parallel_for_work_group) und Speicheroperationen (Copy/Fill). Alles läuft asynchron;.wait()oder Abhängigkeiten nötig, sonst Race Conditions. - Hello World:
malloc_shared<char>(sz, Q)(USM),Q.parallel_for(sz,[=](auto&i){ result[i] -= 1; }).wait()– nur die Lambda-Zeile läuft auf dem Device. - DAXPY-Kernel: SYCL-Kernel entspricht fast zeichenidentisch der Fortran-/C++-Schleife
z[i] = alpha * x[i] + y[i]. - Lambdas: Kernel-Capture immer
[=](by value); Referenz-Captures sind verboten, Kernel müssenvoidzurückgeben.
Theorie
- Throughput (mehr Arbeit pro Zeit) vs. Latency (eine Arbeit schneller aufteilen).
- Amdahls Gesetz (1967): Speedup max.
1/(1-p)bei Parallelanteil p – 2/3 parallel ⇒ Faktor 3, auch mit 100 GPUs. - Gustafson (1988, „Reevaluating Amdahl’s Law”): Parallelismus skaliert wachsende Workloads statt fixer Workloads.
Kernel-Einschränkungen (Device-Code)
Verboten: dynamische Polymorphie/Virtual Functions, new/delete, statische Variablen, Funktionspointer, RTTI, Exceptions, variadische Funktionen, Rekursion. Erlaubt: Lambdas, Templates, Operator-Overloading, statische Polymorphie, const nicht-globale Statics.
Kapitelstruktur (19 Kapitel)
1 Introduction · 2 Where Code Executes · 3 Data Management · 4 Expressing Parallelism · 5 Error Handling · 6 Unified Shared Memory · 7 Buffers · 8 Scheduling Kernels and Data Movement · 9 Communication and Synchronization · 10 Defining Kernels · 11 Vectors · 12 Device Information · 13 Practical Tips · 14 Common Parallel Patterns · 15 Programming for GPUs · 16 Programming for CPUs · 17 Programming for FPGAs · 18 Libraries · 19 Memory Model and Atomics. Kapitel 1–4 als Grundlage in Reihenfolge lesen.
Werkzeuge & Standards
- Zum Erscheinungszeitpunkt: SYCL 1.2.1 aktuell, SYCL 2020 nur provisorisch; DPC++ implementiert u. a. USM, Sub-Groups, CTAD (C++17), anonyme Lambdas.
- Compiler-Bau-Anleitung: intel.github.io/llvm-docs/GetStartedGuide.html; Buch-Code via GitHub (apress.com/9781484255735).
- Race-Detection z. B. mit Intel Inspector; Debug-Tipp: Kernels auf CPU laufen lassen.
Quellen
raw/2021_Book_DataParallelC.pdf– Buch (Apress, Open Access 2021)