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.