Automatische Parallelisierung versagt u.a. bei
-
Routinen mit möglichen Seiteneffekten
-
scheinbaren Abhängigkeiten der Schleifen-Iterationen
-
Task-Parallelität
Lösung: Compiler-Direktiven
-
geben Zusatz-Informationen
-
wählen zu parallelisierende Schleife bei verschachtelten Schleifen
-
definieren zu verteilende Tasks
-
sind abhängig vom Compiler/Hersteller!
OpenMP:
-
Industrie-Standard für Direktiven zur Shared-Memory-Parallelisierung
-
relativ wenige, sehr universelle Konstruktionen
-
für Fortran und C/C++ definiert
Beispielprogramm (Source):
-
Direktiven beginnen (in Fortran) mit !$OMP
-
PARALLEL DO: Schleife wird auf mehrere Threads verteilt
-
PRIVATE(x) : Jeder Thread bekommt eigene Kopie der
Variablen x
-
REDUCTION(+: sum) : lokale Summation in den Threads und Bildung
der globalen Summe
Anzahl der erzeugten Threads:
-
zur Laufzeit durch Umgebungsvariable OMP_NUM_THREADS festgelegt
-
default: abhängig von der Implementierung
auf parallel: Anzahl der Prozessoren des Rechners
Laufzeiten:
CPUs |
1 |
2 |
4 |
8 |
Zeit/s |
64.7 |
32.8 |
16.3 |
8.7 |
Speedup |
1 |
2.0 |
4.0 |
7.4 |
Weitere Informationen im Kurs
Portable Shared-Memory-Programmierung mit OpenMP
Peter Junglas 7.2.2000