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: queue ist 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üssen void zurü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)

Verwandte Artikel