Parallelisierung: C++-Bibliothek HPX erreicht Version 1.5 mit Kurs auf C++20
Die C++-Bibliothek HPX erlaubt Entwicklern High-Level-Multithreading und macht bereits zahlreiche Features für den bevorstehenden Standard C++20 seetauglich.
- Silke Hahn
Das Open-Source-Projekt HPX legt Version 1.5 seiner C++-Bibliothek vor. HPX steht für High Performance ParalleX und setzt mit Parallelisierung und Nebenläufigkeit zusammenhängende Funktionen des C++-Standards um, darunter auch die in C++17 beschriebenen parallelen Algorithmen. Hinsichtlich paralleler und verteilter Programmierung enthält HPX Tools, die über den C++-Standard hinaus gehen.
Paralleles und nebenläufiges Programmieren unter C++20
Die neue Ausgabe konzentriert sich bei den Neuerungen auf APIs und die Kompatibilität zum bevorstehenden neuen Standard C++20. Eine der großen Neuerungen des kommenden Standards ist die Modularisierung: Die Headerdateien und Features von HPX sowie die öffentliche API sollen nun sukzessive Module unterstützen und die Bibliothek dadurch strukturell stärker C++20 annähern. Alle nicht verteilten Module seien bereits unter Dach und Fach, teilt das HPX-Team im Blog der Stellar Group mit. Experimentell können Entwickler offenbar optional die verteilten Funktionalitäten auch komplett unterdrücken.
Mit dem Befehl HPX_WITH_DISTRIBUTED_RUNTIME
können Nutzer eine neue CMake-Option aktivieren: Das Release hat CMake-Ziele für abhängige Objekte mit an Bord. Zahlreiche Header gelten ab der neuen Version als veraltet (deprecated). Namespaces und Header haben teils Anpassungen erfahren. Von ihnen abhängiger Code sollte sich dennoch weiterhin kompilieren lassen, wobei offenbar Warnungen erscheinen, die auf Änderungsbedarf hinweisen. Ebenfalls neu ist der CUDA-Support, der in dem Namespace hpx::cuda::experimental
verfügbar ist – aktivieren lässt er sich mit der CMaker-Option -DHPX_WITH_ASYNC_CUDA=ON
.
CUDA-Support und neue Exekutoren
Das Entwicklerteam hat Typinformationen für Performance Counter ergänzt und alle bestehenden APIs, die mit Resilienz zu tun haben, in den Namespace hpx::resiliency::experimental
verschoben. Laut Blogmitteilung ist das ein Breaking Change ohne Abwärtskompatibilität. Um die bestehenden Resilienz-Features in andere Bereiche wie die Parallelalgorithmen zu integrieren, führt HPX 1.5 zwei neue Exekutoren ein: replay_executor
und replicate_executor
. Weitere Exekutoren haben Änderungen erfahren. So hat das HPX-Team einen polymorphen Exekutor implementiert, der die Kompilierzeiten reduzieren soll, und den zugrundeliegenden block_executor
renoviert.
Die neue Version hat einige Abhängigkeiten von der Boost-Library entfernt, und HPX-Threads sollen sich nun auf dem selben Arbeiter-Thread neu planen lassen, auf dem sie angehalten wurden. Mit diesem Verhalten lassen sich wohl Cache-Fehler vermeiden, die sonst beim Umzug von einem Thread zum nächsten passieren würden. Weitere Neuerungen umfassen experimentellen Namespace für asynchrone MPI-Aufrufe, Serialisations-Support für std::variant
und std::tuple
. Die Unterstützung für co_await
hat das Team an C++20-Vorgaben angepasst: Zusätzlich zu hpx::future
unterstützt es nun auch hpx::shared_future
.
High-Level-Multithreading mit HPX
Mit abstrakten Konzepten wie Continuations und Tasks soll HPX C++-Entwicklern das Multithreading-Programmieren erleichtern. Bis zur Einführung von Multithreading-Tools im ISO-C++-Standard sind Fremdbibliotheken wie HPX für Entwickler das Mittel der Wahl: Die ISO-C++-Multithreading-Features sind zumeist eher "low-level" und etwas fehleranfällig. Seit C++17 geht es bei C++ in Richtung High-Level-Multithreading – eine Weiterentwicklung, die sich hinsichtlich hardwarebedingter Performancegrenzen offenbar als notwendig erweist. Der Convener des ISO-Standardkomitees Herb Sutter hatte einen Paradigmenwechsel in Richtung Concurrency für die Softwareentwicklung mit C++ bereits 2005 angeregt.
Ein besonderes Augenmerk legt HPX auf verteilte Systeme und Portabilität. Deshalb erweitert HPX einige der C++-Standard-Programmierschnittstellen für verteilte und heterogene Systeme, sodass etwa die Arbeit auf Rechenclustern leichter fällt. Enthalten sind zudem Implementierungen von zur Standardisierung vorgeschlagenen Funktionen wie Task-Blöcken und datenparallelen Algorithmen.
Paralleles und verteiltes Programmieren ist nicht trivial. Die C++-Bibliothek HPX enthält Werkzeuge, die die Programmierung vereinfachen. Fachartikel von Detlef Wilkening: "Multithreading-Programmierung mit HPX".
Mehr Informationen zum aktuellen Release lassen sich dem Blog der Stellar Group entnehmen, die hinter HPX steht. Das Projekt ist auch auf GitHub vertreten.
(sih)