OpenMP (Open Multi-Processing) ist eine Programmierschnittstelle für die Parallelisierung auf Systemen mit geteiltem Speicher: Ein Prozess startet mehrere Threads, die denselben Adressraum teilen. Entwickelt wird der Standard vom OpenMP Architecture Review Board; die erste Fassung erschien 1997. OpenMP unterstützt C, C++ und Fortran und ist damit die einfachste Möglichkeit, vorhandene Mehrkern-Prozessoren auszureizen.
Direktiven statt Nebenläufigkeits-Code
Anders als bei Thread-Bibliotheken schreibt man keine Thread-Verwaltung selbst, sondern markiert den zu parallelisierenden Code mit Compiler-Direktiven. In C/C++ beginnt jede Direktive mit #pragma omp:
#pragma omp parallel for
for (int i = 0; i < n; i++) {
c[i] = a[i] + b[i];
}
Der Compiler erzeugt daraus automatisch parallelen Code. Wichtige Direktiven sind parallel, for, sections, single, critical, barrier und reduction. Eine Reduktion fasst Teilergebnisse der Threads korrekt zusammen:
#pragma omp parallel for reduction(+:summe)
for (int i = 0; i < n; i++) summe += array[i];
Fork-Join-Modell
Beim Eintritt in einen parallelen Bereich forkt der Haupt-Thread eine Gruppe von Threads (Team); am Ende treffen sie sich wieder im Join. Die Thread-Anzahl steuert die Umgebungsvariable OMP_NUM_THREADS oder die Laufzeitfunktion omp_set_num_threads(); omp_get_thread_num() liefert die ID des eigenen Threads. Mit schedule(static|dynamic|guided|runtime) legt man fest, wie Schleifeniterationen auf die Threads verteilt werden.
Abgrenzung zu MPI und GPU-APIs
OpenMP funktioniert nur innerhalb eines Rechners mit geteiltem Speicher. Für mehrere Knoten in einem Cluster nutzt man MPI – das übliche Muster ist hybrides MPI + OpenMP. Für Beschleuniger wie GPUs sind CUDA oder OpenCL zuständig; neuere OpenMP-Versionen können aber auch GPU-Bereiche über target-Direktiven ansprechen. Seit Version 4.0 (2013) unterstützt OpenMP Beschleuniger offiziell, OpenMP 6.0 erschien 2024.
Verwandte Grundlagen: Thread, Multikern-Prozessor, SIMD, Nebenläufigkeit, OpenMP-Befehle.