Shared Memory Programmierung: Übungen

Slides:



Advertisements
Ähnliche Präsentationen
C Tutorium – Semaphoren –
Advertisements

6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Objektorientierte Programmierung
Kapitel 6.1 Nebenläufigkeit und wechselseitiger Ausschluss
Java: Grundlagen der Objektorientierung
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Objekte und Arbeitsspeicher
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
ARRAY oder FELD oder VEKTOR
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
OpenMP Präsentation im Rahmen des Seminars
Statischer Druck (Aufgabe 3) Projektübung Klimamodellierung ( ) – A. Paul.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
Vorlesung, Wintersemester 2009/10M. Schölzel 1 Optimierungstechniken in modernen Compilern Optimierungstechniken für SMP- Architekturen.
Vortrag III Hier in der Vorlesungszeit! Anwesenheitspflicht Jede Gruppe hat 6 Minuten! Stellt eure GUI vor –was ihr besonderes gemacht habt –Spektakuläre.
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Einführung Oswald Haan
XINFO HORIZONT XINFO in der Anwendungsentwicklung
Bs Gemeinsame Datensegmente am Beispiel Solaris [Beachte: Unix/Linux setzen keine Hardware-Segmentierung voraus und sprechen daher statt von.
Programmbereich, zu dem eine Deklaration gehört Arten von Gültigkeitsbereichen -Namespace : Deklarationen von Klassen, Interfaces, Structs, Enums, Delegates.
Variablen in Programmiersprachen
JOMP
Parallelisierung für Multiprozessor-Maschinen
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI-Praxis Einführung Oswald Haan
Alois Schütte Advanced System Programming 2 Interprozeßkommunikation  2.1 JVM Ablaufumgebung  2.2 Java Native Interface (JNI)  Verwendung von.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Minimal spannende Bäume
Java-Kurs Übung Besprechung der Hausaufgabe
Parallel Programming OpenMP und JOMP
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Variablen und Operatoren. C++ Teil 2: Grundstrukturen Variablen Operatoren Kontrollstrukturen Funktionen Header-Dateien Pointer und Referenzen.
Einführung. Ziel der Veranstaltung  Vermittlung von Grundkenntnissen in C++  Solide Basis für anschließende Weiterentwicklung  Fähigkeit, kleine Programme.
© 2008 TravelTainment The Amadeus Leisure Group Thread-Programmierung im Qt-Framework Von: Simon Lubberich Erstbetreuer:
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Parallele Lösung von Differential-Algebraischen Gleichungssystemen und Sensitivitätssystemen Seminarvortrag Daniel Abele
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Threads Alexander Sczyrba Jan Krüger.
Einführung in AspectJ ● Inhalt: 1)Überblick 2)Elemente des crosscuttings in AspectJ 3)„Hello World“ in AspectJ 4)Wie Aspekte in Java verwoben werden 5)Join.
Verwalten von Daten mit Hilfe von NTFS
Das IT - Informationssystem
Anforderungen an die neue Datenstruktur
Hello World! Javakurs 2013 Arne Kappen
Datentypen: integer, char, string, boolean
Java-Kurs - 4. Übung weitere Kontrollstrukturen
Einführung in die Programmierung mit Java
Referenzen In c kennen wir gewöhnliche Variablen und Pointer.
Programmieren in C Module und Bibliotheken
Einführung in die Programmierung
SS 04 Christiane Rauh Christian Hellinger
Einführung in die Programmierung
Algorithmen und Programmierung III
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
«Delegierter» Methoden Schablone Funktionszeiger
Definition Felder Konstruktor Methoden Beispiel
Datenstrukturen und Softwareentwicklung
Implementieren von Klassen
Felder in der Informatik
Grundlagen der OO-Programmierung in C#
Objektorientierte Programmierung
Statische und Nichtstatische Methoden Properties / Eigenschaften
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
Datentyp- umwandlung.
Einführung in die Programmierung
Shared Memory Programmierung: Grundlagen
Shared Memory Programmierung: OpenMP
 Präsentation transkript:

Shared Memory Programmierung: Übungen Zugang Daten-Attribute Race condition Parallelisierungs-Overhead Lastverteilung mit SCHEDULE Prozedur-übergreifende Parallelisierung Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Zugang Einloggen auf gwdk032.gwdg.de Kopieren der Übungsbeispiele mit cp -r ~ohaan/Uebungen . Editieren, Übersetzen, Binden und Starten von Programmen auf dem Knoten gwdk032 Bearbeitung der Programme auf gwdk030,gwdk032 (interaktiv) gwdk061 – gwdk064 (Batch) Verzeichniswechsel cd Uebungen/Start Compilieren von hello.f xlf_r -qsmp=omp hello.f bzw. hello.c xlc_r -qsmp=omp hello.c Starten im Dialog a.out Starten im Batch llsubmit lljob Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Batch-Verarbeitung Jobfile lljob #!/bin/ksh # @ job_type = parallel # @ job_name=kurs # @ wall_clock_limit = 00:10:00,00:10:00 # @ output = out.$(jobid) # @ error = err.$(jobid) # @ class = sp_kurs # @ node = 1,1 # @ tasks_per_node = 1 # @ node_usage = not_shared # @ network.MPI = switch,shared,US # @ queue a.out Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Batch-Verarbeitung Starten: llsubmit <lljob> Job-Abfrage: llq, llall Abbrechen: llcancel <jobid> Status-Abfrage llstatus Ergebnisse in out.<jobid> und err.<jobid> Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 1: hello Modifizieren Sie hello.f, so, daß anstelle von –1 die Thread-ID ausgegeben wird. Hinweis: Verwenden Sie die Laufzeitroutine OMP_GET_THREAD_NUM() und das Daten-Attribut PRIVATE Verändern Sie die Anzahl der verwendeten Threads Hinweis: Verwenden Sie dieUmgebungsvariable OMP_NUM_THREADS oder die Laufzeitroutine OMP_SET_NUM_THREADS(nthr) Shared Memory Programmierung: OpenMP

Daten-Attribute in parallelen Regionen Default Attribut ist SHARED Default Attribut für Iterationsvariable in paralleler do-Schleife ist PRIVATE Variablen, die in jedem Thread separat modifiziert werden, müssen explizit als PRIVAT deklariert werden, z.B.: alle skalaren Variablen, die in der parallelen Region gesetzt werden alle Felder, deren lokale Indexmengen gemeinsame Elemente haben Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 2: matmul Wechseln Sie in das Verzeichnis Attribute Ergänzen Sie in matmul.f die notwendigen Attribute für die PARALLEL DO Direktive Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP FIRSTPRIVATE Beispiel: associate.f a,b,c=1 !$OMP PARALLEL PRIVATE(a), FIRSTPRIVATE(b) das lokale a ist nicht mit dem globalen a assoziiert alle lokalen b‘s sind mit dem Wert des globalen b initialisiert !$OMP END PARALLEL Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP LASTPRIVATE Beispiel: associate.f !$OMP DO do i = 1 , n Nach der parallelen Region ist der Iterationsindex i nicht mehr mit dem i aus der Schleife assoziiert !$OMP DO LASTPRIVATE(i) Nach der parallelen Region hat der Iterationsindex i den Wert n+1 Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP race condition Bei unsynchronisiertem Modifizierung von gemeinsamen Variablen kann das Ergebnis unvorhersehbar sein z. B.: Programm in Datei sum_race.f do i = ia , ie globsum = globsum + a(i) end do Jeder Thread hat eigene Iterationsgrenzen ia, ie, globsum ist eine Variable mit dem Attribut SHARED Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 3: sum_race Wechseln Sie in das Verzeichnis Attribute Übersetzen Sie sum_race.f mit Hilfe des Makefiles Verifizieren Sie das Auftreten der race condition durch mehrmaligen Aufruf des ausführbaren Programms mit den Eingaben aus der Datei inp sum < inp Modifizieren Sie das Programm so, dass die race condition nicht mehr auftritt Hinweis: Verwendung Sie die Direktiven !$OMP ATOMIC oder !$OMP CRITICAL / !OMP END CRITICAL Shared Memory Programmierung: OpenMP

Aufgabe 4: sum_race mit LOCK Beheben Sie die race condition mit locks Hinweis: Programmstruktur mit LOCK-Routinen integer lck call OMP_INIT_LOCK(lck) ... call OMP_SET_LOCK(lck) geschützter Bereich call OMP_UNSET_LOCK(lck) call OMP_DESTROY_LOCK(lck) lck muss das Attribut SHARED haben! Shared Memory Programmierung: OpenMP

Aufgabe 5: sum_reduction Vereinfachen Sie das Programm sum_race durch Verwendung der Direktiven !$OMP PARALLEL DO Hinweis: die Summationsvariable globsum muss als Reduktionsvariable deklariert werden durch Verwendung des Attributes REDUCTION(+:globsum) Shared Memory Programmierung: OpenMP

Overhead durch Parallelisierung Die wichtigsten Quellen für Leistungsverluste durch Parallelisierung sind Thread-Erzeugung zu Beginn der parallelen Region Synchronisation zu Ende der parallelen Region Jede weitere Synchronisation mit BARRIER oder FLUSH Exklusive Zugriffe auf gemeinsame Variablen Ungleiche Lastverteilung Overhead für Parallele Schleife auf IBM Winterhawk2: ca 20 microsec = 7500 Zyklen ( bei 375 MHz Taktrate) Shared Memory Programmierung: OpenMP

SMP Summe auf IBM Winterhawk2 Shared Memory Programmierung: OpenMP

SMP Summe auf IBM Regatta Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 6: Zeitmessung Wechseln Sie in das Verzeichnis Zeitmessung Compilieren Sie das Programm in synch.f : xlf_r -qsmp=omp synch.f Starten Sie das Programm mit 1,2,3 und 4 Threads Hinweis: Zahl der Threads auf nthr setzen mit export OMP_NUM_THREADS=nthr Shared Memory Programmierung: OpenMP

Lastverteilung in einer Schleife OpenMP stellt drei Methoden zur Verteilung von Iterationen einer Schleife auf die Threads zur Verfügung: SCHEDULE(STATIC,n) SCHEDULE(DYNAMIC,n) SCHEDULE(GUIDED,n) Mit SCHEDULE(RUNTIME) kann die Verteilung zur Laufzeit gewählt werden : export OMP_SCHEDULE=“method,n“ Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 7: sched.f Wechseln Sie in das Verzeichnis Schedule Testen Sie durch Modifikation von sched.f die Verteilung der Schleifeniterationen bei verschiedenen SCHEDULE-Methoden Shared Memory Programmierung: OpenMP

Shared Memory Programmierung: OpenMP Aufgabe 8: force.f Wechseln Sie in das Verzeichnis Schedule Das Programm force.f enthält die Schleife für die Kraftberechnung in einem System von n Lennard-Jones-Molekülen. Übersetzen Sie mit make Setzen Sie die Umgebungsvariable OMP_SCHEDULE Finden Sie für n=5000 die günstigste Methode für SCHEDULE Shared Memory Programmierung: OpenMP

Prozedur-übergreifende Parallelisierung OpenMP-Direktiven sind über Prozedurgrenzen gültig subroutine work(sum) integer tid, sum integer OMP_GET_THREAD_NUM ... tid = OMP_GET_THREAD_NUM() !$OMP CRITICAL sum = sum + tid !$OMP END CRITICAL program a ... !$OMP PARALLEL call work(sum) !$OMP END PARALLEL statischer Gültigkeitsbereich (static extent) verwaiste Direktiven (orphaned directives) dynamischer Gültigkeitsbereich (dynamic extent) Shared Memory Programmierung: OpenMP

Daten-Attribute bei Prozedur-übergreifender Parallelisierung Attribute in Direktiven gelten nur im statischen Geltungsbereich, außer für Variable, die als Argumente in Prozeduraufrufen übergeben werden Lokale Variable ohne SAVE Attribut in Prozeduren, die aus einer parallele Region gerufen werden, haben implizit das Attribut PRIVATE Lokale Variable mit SAVE Attribut, COMMON Blöcke und MODULE Daten in Prozeduren, die aus einer parallele Region gerufen werden, haben implizit das Attribut SHARED Als THREADPRIVATE deklarierte COMMON Blöcke haben in Prozeduren, die aus einer parallele Region gerufen werden, haben implizit das Attribut PRIVATE Shared Memory Programmierung: OpenMP

Compiler Flags und Daten-Attribute Fortran77 Compiler (xlf, xlf_r) hat Default -qsave: alle lokalen Variablen sind SHARED -qnosave muss beim Compilieren gesetzt werden Fortran90 Compiler (xlf90, xlf90_r) hat Default -qnosave: alle lokalen Variablen sind PRIVATE Speicherplatzreservierung -bmaxdata:<n Bytes> reserviert Platz für Daten mit Attribut SHARED -bmaxstack:<n Bytes> reserviert Platz für Daten mit Attribut PRIVATE, maximaler Wert für Stack in 32bit Compilierung ist 256 MB Shared Memory Programmierung: OpenMP