Nach drei Jahren Entwicklung wurde das Spezifikationspaket OpenMP 6.0 (Open Multi-Processing) veröffentlicht, das die API und Anwendungsweisen für parallele Programmierung in den Sprachen C, C++ und Fortran auf Mehrkern- und hybriden (CPU+GPU/DSP) Systemen mit gemeinsamem Speicher und SIMD-Vektorisierungsblöcken definiert. Es wird erwartet, dass die anfängliche Unterstützung für bestimmte Funktionen von OpenMP 6.0 in die Versionen LLVM/Clang 20 und GCC 15 aufgenommen wird.
Die Hauptänderungen in OpenMP 6.0:
- Der Prozess zur Programmierung von Aufgaben (task), die unabhängige Teile des Programms definieren, die parallel zu anderen Teilen ausgeführt werden können, wurde vereinfacht.
- Die Möglichkeit wurde hinzugefügt, Aufgaben in freien Agenten-Threads auszuführen, die nicht an Gruppen von Threads (teams) gebunden sind, die parallele Regionen (parallel region, ein Codeblock, der in mehreren Threads ausgeführt wird) ausführen.
- Die Unterstützung für die Speicherung von Aufgaben-Diagrammen (taskgraph), die Abhängigkeiten zwischen Aufgaben und die Reihenfolge ihrer Ausführung definieren, wurde sichergestellt, um die Effizienz bei der späteren Wiederholung zu erhöhen.
- Ein Mechanismus für transparente Aufgaben („transparent tasks“) wurde implementiert, um das Management von Abhängigkeiten zu vereinfachen und die Ausführung von Unteraufgaben automatisch zu steuern.
- Die Unterstützung für Rechenressourcen, die zur Ausführung paralleler Aufgaben verwendet werden können (CPU, GPU, DSP usw.), wurde erweitert.
- Eine neue Array-Syntax wurde hinzugefügt, die die Verwendung der Direktive „workdistribute“ ermöglicht, um die Verarbeitung von Arrays auf verschiedene Arbeitseinheiten zu verteilen.
- Die Möglichkeiten zur Verwaltung der Speicherzuweisung wurden erweitert, um das Management von Variablen zu vereinfachen, deren Speicher dynamisch zugewiesen wird.
- Die Unterstützung von Attributen, die die Verteilung von Daten zwischen Geräten standardmäßig definieren, wurde erweitert.
- Das Schreiben von Code für asynchrone Datenübertragungen an zusätzliche Rechenressourcen (GPU) wurde vereinfacht.
- Das Management des Speichers und seiner Bindung an Rechenressourcen wurde verbessert.
- Die Direktive „groupprivate“ wurde hinzugefügt, um den Speicher für eine Gruppe von Threads, die auf einer bestimmten Rechenressource ausgeführt werden, zu reservieren.
- Das Programmieren bestimmter Arten von Schleifen-Transformationen, wie das Zusammenfassen mehrerer Schleifen, das Ändern der Reihenfolge von geschachtelten Schleifen und das Umkehren von Schleifen, wurde vereinfacht.
- Eine neue Induktionsoperation (induction) wurde hinzugefügt, um die Parallelisierung in Schleifen einfacher arithmetischer Berechnungen und benutzerdefinierter Operationen, die von vorherigen Werten abhängen, zu organisieren.
- Vollständige Unterstützung für die Parallelisierung von Programmen, die unter Verwendung der C23-Standards (einschließlich der Attributsyntax), Fortran 2023 und C++23 geschrieben wurden, wurde hinzugefügt. Neue Attribute für C/C++ wurden hinzugefügt.
- Die Möglichkeiten zur Verwaltung des Speichers wurden erweitert. Neue Attribute zur Kontrolle darüber, wie der Speicher zugewiesen und verwendet werden soll, wurden hinzugefügt. Eine API zur Bestimmung und Abfrage von Speicherbereichen (memory space) wurde hinzugefügt.
- Die in den Spezifikationen OpenMP 5.0, 5.1 und 5.2 als veraltet erklärten Funktionen wurden entfernt.
Quelle: opennet.ru
