OpenMP (siehe OpenMP im Glossar) parallelisiert Programme über Compiler-Direktiven: Statt selbst Threads zu erzeugen, markiert man Codeblöcke, die das System automatisch auf mehreren Kernen ausführt. Unterstützt werden C, C++ und Fortran; in C/C++ beginnen alle Direktiven mit #pragma omp.
Parallelregion und Schleifen
#pragma omp parallel // Team aus Threads starten
#pragma omp parallel for // Schleife aufteilen
#pragma omp for schedule(static) // Iterationen verteilen
Die schedule-Klausel steuert die Verteilung: static (Blöcke vorab), dynamic (zur Laufzeit), guided (abnehmende Blöcke) und runtime (per Umgebungsvariable OMP_SCHEDULE).
Synchronisation
#pragma omp barrier // alle Threads warten
#pragma omp critical // geschützter Bereich, einer nach dem anderen
#pragma omp atomic // atomare Operation auf eine Variable
#pragma omp master // nur Thread 0 führt aus
#pragma omp single // genau ein Thread führt aus
Daten teilen und reduzieren
#pragma omp parallel for reduction(+:sum) private(x)
for (i = 0; i < n; i++) { x = a[i] * b[i]; sum += x; }
private(x) gibt jedem Thread eine eigene Kopie, reduction(+:sum) sammelt die Teilsummen am Ende gefahrlos auf. Weitere Klauseln: shared, firstprivate, lastprivate, num_threads, nowait.
Laufzeit-Funktionen
omp_get_thread_num() // eigene Thread-Nummer
omp_get_num_threads() // Teamgröße
omp_set_num_threads(8) // Teamgröße setzen
omp_get_wtime() // Stoppuhr in Sekunden
Die Umgebungsvariable OMP_NUM_THREADS setzt die Standard-Teamgröße, ohne den Code zu ändern.
Verwandte Grundlagen: OpenCL-Befehle, MPI-Befehle, Thread, Multikern-Prozessor, Nebenläufigkeit.