WIRTSCHAFTSINFORMATIK
Westfälische
Wilhelms-Universität
Münster
WIRTSCHAFTS
INFORMATIK
OpenMP
Präsentation im Rahmen des Seminars
„Parallele und verteilte Programmierung“
Michael Westermann
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
Koordination und Synchronisation von Threads
Zusammenfassung
2
Einführung
WIRTSCHAFTS
INFORMATIK
OpenMP: „Open specifications for Multi Processing“
Spezifikation für parallele Programmierung
- Multiprozessor-Systeme
- Gemeinsamer Speicher
Möglichkeit, ein Programm schrittweise zu parallelisieren
Compiler-Direktiven, Bibliotheksfunktionen,
Umgebungsvariablen
Bindings für C, C++ und Fortran
1997 für Fortran; 1998 für C/C++
Aktuelle Version: OpenMP 2.5 (Mai 2005)
Von vielen Soft- und Hardwareherstellern unterstützt (Intel,
Sun, Compaq usw.)
3
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
Koordination und Synchronisation von Threads
Zusammenfassung
4
Vergleich OpenMP vs. MPI
WIRTSCHAFTS
INFORMATIK
Kriterium
OpenMP
MPI
Hardware
Gemeinsamer Speicher
Verteilter oder
Gemeinsamer Speicher
Sprachen
C, C++, Fortran
C, C++, Fortran
Inkrementelle
Parallelisierung
einfach
Programm muss neu
designed werden
Kommunikation
Gemeinsame Variablen
Message Passing
Serialität bleibt erhalten
Ja
nein
Anzahl Prozessoren
Bis ca. 8 praktikabel
Auf sehr hohe CPUAnzahlen skalierbar
OpenMP und MPI können auch kombiniert werden:
- MPI verteilt Arbeit auf Multiprozessor-Systeme
- OpenMP führt die Arbeit dort parallel aus
5
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
- Gemeinsamer Speicher
- Programmiermodell
- OpenMP-Direktiven
Parallelisierung von Programmbereichen
Koordination und Synchronisation von Threads
Zusammenfassung
6
Grundlagen: Gemeinsamer Speicher
WIRTSCHAFTS
INFORMATIK
Gemeinsamer Speicher
- Mehrere Prozessoren
- Einheitlicher Adressraum
Verteilter gemeinsamer
Speicher
- Mehrere Prozessoren
- Seitenbasierter,
virtueller, gemeinsamer
Adressraum
Gemeinsamer
Speicher
Pi: Prozessor i
P0
P1
P2
Pn
Netzwerk
Globaler Adressraum
M0
M1
M2
Mn
P0
P1
P2
Pn
Pi: Prozessor i
Mi: RAM von Pi
Beide Varianten werden von OpenMP unterstützt
7
Grundlagen: Programmiermodell
WIRTSCHAFTS
INFORMATIK
Auf Threads basierend
- Ausführungsfäden innerhalb eines Prozesses
- Leichtgewichtiger als Prozesse
- Gemeinsamer Adressraum, zusätzlich eigener Stack
- Kommunikation über gemeinsame Variablen
MasterThread
FORK
Paralleler
Bereich
Team von
Threads
Fork-join-Prinzip
- Master-Thread erzeugt weitere Threads
- Parallele Ausführung des Bereichs
- Synchronisation der Threads am Ende
- Beenden der Slave-Threads
JOIN
8
OpenMP-Direktiven
WIRTSCHAFTS
INFORMATIK
Einbinden der Datei omp.h zu Beginn
Parallelisierung mittels Compiler-Direktiven
#pragma omp <Klausel>
Direktive wird ignoriert, wenn Compiler OpenMP nicht
unterstützt
- Programm wird seriell ausgeführt
- Identischer Quelltext für Ein- und Multiprozessor-System
9
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
- Parallele Bereiche
- Parallelisierung von Schleifen
- Parallelisierung unabhängiger Abschnitte
Koordination und Synchronisation von Threads
Zusammenfassung
10
Parallele Bereiche
WIRTSCHAFTS
INFORMATIK
parallel-Direktive:
#pragma omp parallel [Parameter [, Parameter]…]
{
Anweisungsblock
}
Grundlegendes Konstrukt
Threads arbeiten Anweisungsblock mit gemeinsamen oder
privaten Variablen ab (single program multiple data, SPMD)
Synchronisation am Ende des parallelen Bereichs
Parallele Bereiche können geschachtelt werden
Parameter:
- Bestimmung der Thread-Anzahl ( num_threads(x) )
- Variablendeklarationen (gemeinsame vs. private Variablen)
11
Parameter: Variablendeklarationen
WIRTSCHAFTS
INFORMATIK
shared(<Liste_Variablen>)
- Gemeinsame Variablen der Threads
Lesen und Schreiben findet auf gleichem Datenbereich statt
private(<Liste_Variablen>)
- Jeder Thread erhält uninitialisierte Kopie der Variablen
Nur der jeweilige Thread kann diese Lesen und Schreiben
default(shared | private | none)
- shared: Variablen sind standardmäßig gemeinsam
- private: Variablen sind standardmäßig privat
- none: Alle Variablen müssen explizit gekennzeichnet werden
Weitere Variablendeklarationen:
- firstprivate, lastprivate, copyin, reduction
12
Parallele Bereiche: Beispiel
WIRTSCHAFTS
INFORMATIK
#include <omp.h>
int nummer;
int main() {
#pragma omp parallel private(nummer) num_threads(4)
{
// Nummer des aktuellen Threads
nummer = omp_get_thread_num();
printf("Thread-Nummer: ",nummer);
}
}
Mögliche Ausgabe:
Thread-Nummer:
Thread-Nummer:
Thread-Nummer:
Thread-Nummer:
0
2
1
3
13
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
- Parallele Bereiche
- Parallelisierung von Schleifen
- Parallelisierung unabhängiger Abschnitte
Koordination und Synchronisation von Threads
Zusammenfassung
14
Parallelisierung einer for-Schleife
WIRTSCHAFTS
INFORMATIK
Speicher
4 Prozessoren:
for(i=1,i<=25,i++)
a[i] = b[i] + c[i]
for(i=1,i<=100,i++)
a[i] = b[i] + c[i]
for(i=26,i<=50,i++)
a[i] = b[i] + c[i]
for(i=51,i<=75,i++)
a[i] = b[i] + c[i]
for(i=76,i<=100,i++)
a[i] = b[i] + c[i]
A[1]
A[100]
B[1]
B[100]
C[1]
C[100]
15
Parallelisierung einer for-Schleife
WIRTSCHAFTS
INFORMATIK
Work-Sharing-Konstrukt
Verteilung der Iterationen auf mehrere Threads
Jede Iteration wird von genau einem Thread ausgeführt
for-Direktive:
#pragma omp
omp parallel
for [Parameter…]
#pragma
for [Parameter…]
for (Index=Startwert; Test; Inkrementierung)
{
Schleifenrumpf
}
Voraussetzungen:
- Iterationen unabhängig voneinander
- Anzahl Iterationen vor Ausführung bestimmbar
- Innerhalb eines parallelen Bereichs (oder kombinierte Direktive)
16
Parallelisierung einer for-Schleife
WIRTSCHAFTS
INFORMATIK
for (i=Startwert; Test; Inkrementierung)
Anforderungen an Schleifenkopf:
i: Variable vom Typ int
Startwert: x
Test: i op x , mit op { <, ≤, >, ≥ }
Inkrementierung: ++i, --i, i++, i--,
i += x, i -= x, i = i + x, i = i - x
x: Schleifenunabhängiger Integer-Ausdruck
17
Parameter for-Direktive: schedule
WIRTSCHAFTS
INFORMATIK
Steuert Aufteilung der Iterationen auf die Threads
Lastverteilung
schedule(static, block_size)
- Iterationen werden in Blöcke der Größe block_size zusammengefasst
- Verteilung der Blöcke auf die Threads bereits vor Ausführung
schedule(dynamic, block_size)
- Iterationen werden in Blöcke der Größe block_size zusammengefasst
- Nach Bearbeitung eines Blockes erhält Thread neuen Block
schedule(guided, block_size)
- Exponentiell abnehmende max Anzahl _ offene_ Iterationen;block _ size
Anzahl _Threads
Blockgröße im Zeitverlauf
- Beispiel: 64 Iterationen, 2 Threads, block_size=4:
1. 64/2=32,
2. 32/2=16,
3. 16/2=8,
4. 8/2=4,
5. 4
18
Beispiel for-Direktive: Primzahlenausgabe
WIRTSCHAFTS
INFORMATIK
#include <stdio.h>
#include <omp.h>
int main() {
int zahl, teiler, treffer;
printf ("Primzahlen: \n");
#pragma omp parallel for private(teiler,treffer) \
schedule(dynamic,100)
for (zahl = 2; zahl < 100000; zahl++) {
treffer = 0;
#pragma omp parallel for private(teiler, treffer)
// Überprüfung ob 2 bis zahl Teiler von zahl
for (teiler = 2; teiler < zahl; teiler++) {
if (zahl % teiler == 0) {
Mögliche Ausgabe:
treffer = 1; }
Primzahlen:
}
2, 3, 5, 7, 11,
if (treffer == 0) {
13, 101, 19,
printf ("%d, ", zahl); }
23, 113, 29,
}
[…], 99991,
}
19
Parameter for-Direktive: ordered
WIRTSCHAFTS
INFORMATIK
Ausführung erst, wenn alle vorherigen Iterationen den
Anweisungsblock beendet haben
ordered-Parameter der for-Direktive hinzufügen
ordered-Direktive vor entsprechenden Anweisungsblock:
#pragma omp ordered
{
Anweisungsblock
}
20
Beispiel: Primzahlenausgabe, aufsteigend
WIRTSCHAFTS
INFORMATIK
#include <stdio.h>
#include <omp.h>
int main() {
int zahl, teiler, treffer;
printf ("Primzahlen: \n");
#pragma omp parallel for private(teiler, treffer) \
schedule(static,1) ordered
for (zahl = 2; zahl < 100000; zahl++) {
treffer = 0;
// Überprüfung ob 2 bis zahl Teiler von zahl
for (teiler = 2; teiler < zahl; teiler++) {
if (zahl % teiler == 0) {
Ausgabe:
treffer = 1; }
Primzahlen:
}
2, 3, 5, 7, 11,
#pragma omp ordered
13, 19, 23, 29,
if (treffer == 0) {
31, 37, 41, 43,
printf ("%d, ", zahl); }
47, […], 99991,
}
}
21
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
- Parallele Bereiche
- Parallelisierung von Schleifen
- Parallelisierung unabhängiger Abschnitte
Koordination und Synchronisation von Threads
Zusammenfassung
22
Parallelisierung unabhängiger Abschnitte
WIRTSCHAFTS
INFORMATIK
Work-Sharing-Konstrukt
Abschnitte werden auf Threads verteilt
Jeder Abschnitt wird von genau einem Thread ausgeführt
sections-Direktive:
#pragma omp sections [ Parameter [, Parameter …] ]
{
[ #pragma omp section
{ Anweisungsblock_1 } ]
[ #pragma omp section
{ Anweisungsblock_2 } ]
}
Abschnitte müssen unabhängig voneinander sein
section-Direktive nur innerhalb der sections-Direktive
23
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
Koordination und Synchronisation von Threads
- Kritische Abschnitte
- Atomare Operationen
- Synchronisation
- Ausführung ausschließlich des Master-Threads
Zusammenfassung
24
Race Conditions
WIRTSCHAFTS
INFORMATIK
Beispiel:
A=0
2 Threads führen parallel aus: A = A + 1
Mögliche Ergebnisse:
- A=2
- A=1
Ergebnis hängt vom zeitlichen Ablauf der Operationen ab
Lösungsmöglichkeiten:
- Kritische Abschnitte
- Atomare Operationen
25
Kritische Abschnitte
WIRTSCHAFTS
INFORMATIK
Wechselseitiger Ausschluss (mutual exclusion)
Abschnitte werden zu kritischen Abschnitten deklariert
Höchstens ein Thread darf gleichzeitig im kritischen
Abschnitt mit gleichem name sein
critical-Direktive:
#pragma omp critical [(name)]
{
kritischer_Abschnitt
}
26
Atomare Operationen
WIRTSCHAFTS
INFORMATIK
Zuweisung wird „am Stück“ (atomar = unteilbar) ausgeführt
atomic-Direktive:
#pragma omp atomic
Zuweisung
Zuweisung darf folgende Form haben:
- x++, x- - ++x, - - x
- x binop= skalarer_Ausdruck
binop { +, -, *, /, &, ^, |, <<, >> }
skalarer_Ausdruck darf nicht auf x referenzieren
und ist nicht Teil der atomaren Operation
27
Synchronisation von Threads
WIRTSCHAFTS
INFORMATIK
barrier-Direktive:
#pragma omp barrier
Thread setzt Ausführung erst fort, wenn alle Threads die
barrier-Direktive erreicht haben
Bezieht sich nur auf Threads des eigenen „Teams“
Direktive muss von allen oder von keinem Thread erreicht
werden
- Sonst: Verklemmung (Deadlock)
28
Ausführung nur durch Master-Thread
WIRTSCHAFTS
INFORMATIK
Master-Direktive:
#pragma omp master
{
Anweisungsblock
}
Anweisungsblock wird ausschließlich von Master-Thread
bearbeitet
Bei verschachtelter Parallelisierung:
Master-Thread des innersten parallelen Bereichs
Alle anderen Threads ignorieren den Block
29
Gliederung
WIRTSCHAFTS
INFORMATIK
Einführung
Vergleich von OpenMPI und MPI
Grundlagen
Parallelisierung von Programmbereichen
Koordination und Synchronisation von Threads
Zusammenfassung
30
Zusammenfassung
WIRTSCHAFTS
INFORMATIK
Einheitlicher Standard für Programmierung von
Parallelrechnern mit gemeinsamem Speicher
Ermöglicht leichte Parallelisierung bestehender
Programme (inkrementelle Parallelisierung)
Parallelisierung mittels Compiler-Direktiven
Fork-join-Prinzip
Unterstützung namhafter Hersteller
http://www.openmp.org/
31
WIRTSCHAFTSINFORMATIK
Westfälische
Wilhelms-Universität
Münster
WIRTSCHAFTS
INFORMATIK
Vielen Dank
für die
Aufmerksamkeit