Parallelprogrammierung: Visual Studio vertieft OpenMP-Unterstützung für C++

Die API-Spezifikation für Parallelprogrammierung hilft C/C++ und Fortran bei prozessorübergreifendem Arbeiten und ist nun stärker in Visual Studio integriert.

In Pocket speichern vorlesen Druckansicht 17 Kommentare lesen

(Bild: cherezoff / Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

Microsoft plant offenbar, die bestehende Unterstützung der Programmierschnittstelle OpenMP für C++ in Visual Studio (VS) zu vertiefen: Wie das VS-Team im Developer-Blog angekündigt hat, soll demnächst eine Reihe von Features aus älteren und neueren Versionen des Standards in die Entwicklungsumgebung Einzug halten. VS soll künftig die x86- und ARM64-Architektur unterstützen (Bestandteil von OpenMP 3.1), Unterstützung für Pragmas und Clauses (aus OpenMP 4.5) steht als Nächstes auf dem Plan. Welche Features dann folgen, ist offen – darüber soll laut Blogeintrag das Nutzerfeedback entscheiden.

Den Auftakt der Integration von OpenMP hatte Version 16.9 von Visual Studio 2019 mit einigen experimentellen Features gemacht, und seither erhält der OpenMP-Standard zunehmend systematische Unterstützung. Die Entwicklungsumgebung ist zum Beispiel bereits kompatibel mit der Runtime Library von OpenMP zum C++-Compiler LLVM (libomp).

Der von Visual Studio eingeführte Switch -openmp:llvm gilt als kompatibel mit allen SIMD-Richtlinien (Single Instruction, Multiple Data) seitens OpenMP: VS-Nutzerinnen und -Nutzer müssen dafür offenbar zunächst die experimentellen Features aktivieren, indem sie -openmp:experimental einschalten. Mit dem LLVM-Switch lassen sich Executables kompilieren, -openmp:llvm fügt laut Blogeintrag automatisch einen dynamischen Link zur DLL (Dynamic Link Library) von OpenMP (libomp) ein. Interessierte finden die notwendigen DLLs im Installationsverzeichnis der Entwicklungsumgebung, die Executables benötigen zur korrekten Ausführung Zugriff darauf (er wird automatisch im Pfad inkludiert, wenn das Executable zum Beispiel über x64 Native Tools läuft).

Für den neuen Switch gilt die Einschränkung, dass er sich noch im experimentellen Stadium befindet, weswegen Asserts aktiviert sind zum einfacheren Debugging. Die gegenwärtige Version der Dynamic Link Libraries (DLL) gilt als "nicht weiterverteilbar" (not redistributable), und künftige Versionen der libomp DLLs werden möglicherweise nicht abwärtskompatibel sein. -openmp:llvm ist inkompatibel mit /clr und /ZW. Dem Blogeintrag lassen sich detailliertere Hinweise zum korrekten Vorgehen entnehmen.

Als behoben gelten laut Blogeintrag einige Fehler im Bereich der Lastprivate Clauses in #pragma omp sections, die Verwendung von -openmp:llvm sollte die Korrekturen aktivieren. Die Bedingung "Lastprivate Clause" garantiert beim Verlassen von Abschnittsblöcken (sections), dass die in der Bedingung gelisteten Variablen nach dem Verlassen an die private Version der Variablen des letzten Abschnitts angepasst sind. Folgendes Codebeispiel verdeutlicht, worum es geht:

int x = 0;
#pragma omp parallel sections lastprivate(x)
{
   #pragma omp section
   x = 4;
   #pragma omp section
   x = 6;
}

Zusätzlich zu den beschriebenen Korrekturen unterstützt der neue -openmp:llvm-Switch einige Funktionalitäten des Standards OpenMP 3.0: Parallele for-Loops dürfen jetzt ganze Zahlen ohne Vorzeichen zum Indizieren verwenden, eingeschränkte Unterstützung für #pragma omp task ist enthalten, allerdings kann das Entwicklertem von Visual Studio zurzeit noch nicht garantieren, dass Bedingungen des Task-Pragmas auch korrekt funktionieren. Aufgrund dieser Einschränkungen lässt sich Pragma vorerst nur experimentell nutzen durch Einschalten des Switches -openmp:experimental.

Seit den neunziger Jahren gibt es mit OpenMP eine Programmierschnittstelle für C/C++ und Fortran als Antwort auf die damals aufgekommenen Multicore-Systeme und Prozessoren – OpenMP gilt heute als De-facto-Standard für die Shared-Memory-Parallelisierung im technisch-wissenschaftlichen Bereich. Es unterstützt die Programmiersprachen C/C++ sowie Fortran und kommt zum Einsatz bei Embedded-Plattformen, Hardware-Beschleunigern und Multicore-Systemen sowie im Bereich von Shared Memory. Das Implementieren ohne Lizenzkosten steht allen frei, daher die Bezeichnung als "offener" Standard. Ein unabhängiges Review Board (OpenMP Architecture Review Board) und eine Gruppe von Anwendern treiben die Entwicklung der Spezifikation voran.

Seit der Hauptversion 2.0 aus dem Jahr 2005 unterstützt Visual Studio die API-Spezifikation und verfügt seit 2019 über einen Schalter zum Aktivieren der in OpenMP 4.0 eingeführten SIMD-Richtlinie zum Verarbeiten des Befehlssatzes zu "Single Instruction, Multiple Data" (SIMD), der zum Beispiel beim Streaming von Daten mittels SSE (Streaming SIMD Extensions) zum Tragen kommt.

Die aktuelle Version der API-Spezifikation ist das im November 2020 erschienene OpenMP 5.1, das laut Review Board und OpenMP Language Committee eine bessere Interoperabilität mit Low-Level-APIs wie CUDA bereithält und neben C++11 bis C++17 auch bereits den neuen Sprachstandard C++20 unterstützt. Weitere Informationen lassen sich dem Blogeintrag der VS-Entwickler entnehmen.

(sih)