Parallelisierung für Multiprozessor-Maschinen

Slides:



Advertisements
Ähnliche Präsentationen
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Advertisements

Kapselung , toString , equals , Java API
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
Java: Dynamische Datentypen
Listen Richard Göbel.
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Schleifen-beobachtung
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,
Polymorphie (Vielgestaltigkeit)
Dynamischer Speicher. In einer Funktion wird z.B. mit der Deklaration int i; Speicher auf dem sogenannten Stack reserviert. Wenn die Funktion verlassen.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
OpenMP Präsentation im Rahmen des Seminars
Imperative Programmierung Funktionen und Parameter
Einführung in die OOP in Java
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Programm besteht aus mehreren Bestandteilen: Schlüsselwörter Sonderzeichen Bezeichner Kommentare Texte.
Zusammenfassung Vorwoche
Vorlesung, Wintersemester 2009/10M. Schölzel 1 Optimierungstechniken in modernen Compilern Optimierungstechniken für SMP- Architekturen.
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
EDV Parallelprogrammierung1 Parallelprogrammierung mit JAVA.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
Das Roboterprojekt Einführung Der erste Entwurf Das Thread-Konzept Hindernisse Website.
Informatikunterricht mit Java
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Java programmieren mit JavaKara
Duo- und Quad Prozessor-Architektur
Effiziente Algorithmen
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
EPROG Tutorium Einheit 4 Klassen und Objekte. Wiederholung Schleifen do... while while for break/continue Strings String char Methoden für Strings Arrays.
Effiziente Algorithmen
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Parallel Matrix Multiplication
Parallel Programming Condition Queues
Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger
Vom Umgang mit Daten. public void myProgram() { int[] saeulenWerte = new int[world.getSizeX()]; for (int i = 0; i < saeulenWerte.length; i++) { saeulenWerte[i]
2.4 Rekursion Klassifikation und Beispiele
Wahrscheinlichkeitsrechnung
Thread Synchronisation in JAVA
Unterprogramme in JAVA
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Optimierungstechniken in modernen Compilern
EPROG Tutorium #3 Philipp Effenberger
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
JOMP
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Javelin Internet-based parallel computing using Java.
Programmiervorkurs WS 2014/15 Schleifen
CuP - Java Achte Vorlesung Entspricht ungefähr Kapitel 4.1 des Skriptums Montag, 28. Oktober 2002.
Java-Kurs - 3. Übung Hausaufgabe Arrays For-Schleifen.
Ausnahmen Vorlesung besteht aus zwei Teilen Programmierung (4 SWS)
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
Minimal spannende Bäume
Parallel Programming OpenMP und JOMP
Algorithmen und Datenstrukturen Prof. Dr. Ralf Möller Universität zu Lübeck Institut für Informationssysteme Stefan Werner (Übungen) sowie viele Tutoren.
Multiprocessing mit OpenMPI Marius Albath. Vorlesung Betriebssysteme, Was ist OpenMPI Was ist OpenMPI OpenMPI Standard Setup OpenMPI Standard.
 Präsentation transkript:

Parallelisierung für Multiprozessor-Maschinen Teil 1

Konzeptionelle Voraussetzungen Wir müssen davon ausgehen, dass... Der aktuelle Thread nicht die höchste Priorität haben muss Ein Thread mit niedriger Priorität gleichzeitig laufen kann Threads mit unterschiedlichen Prioritäten gleichzeitig laufen können Sich die Gefahr von „Race Conditons“ erhöht

Parallelisierung eines Single-Thread Programms public class SinTable { private float lookupValues[] = null; public synchronized float[] getValues() { if (lookupValues == null) { lookupValues = new float [360 * 100]; for (int i = 0; i < (360 * 100); i++) { float sinValue = (float)Math.sin(i % 360) * Math.PI/180.0); lookupValues[i] = sinValue * (float)i / 180.0f; } } return lookupValues; } }

SinTable mit mehreren Threads

Die Methode getValues() public float[] getValues() { for (int i = 0; i < numThreads; i++) { lookupThreads[i] = new Thread(this); lookupThreads[i].start(); } try { lookupThreads[i].join(); } catch (InterruptedExpception iex) {} return lookupValues;

Loop Scheduling und Load Balancing Loop Scheduling ist der Verteilungsprozess von Iterationen auf die einzelnen Threads. Es gibt viele verschiedene Arten des loop-schedulings. Unter Load Balancing (Lastverteilung) versteht man die möglichst gleichmäßige Verteilung der Berechnungen auf die einzelnen Threads. Dabei sollte der Rechenaufwand für die Verteilung (Overhead) so gering wie möglich gehalten werden.

Statisches, bzw. Chunk Scheduling Jeder Thread erhält die gleiche Anzahl von Iterationen. Vorteil: Der Rechenaufwand für die Verteilung der Iterationen (Overhead) ist gering. Nachteil: Funktioniert nur mit Algorithmen, bei denen jede Iteration ungefähr die gleiche Rechenzeit beansprucht - sonst befinden sich evtl. mehrere Prozessoren gegen Ende der Berechnung im Leerlauf.

Self-Scheduling Beim Self-Scheduling werden dem Thread nur wenige Iterationen zugewiesen. Nachdem diese berechnet wurden, werden dem Thread wieder nur wenige Iterationen übergeben. Vorteil: Auch wenn alle Threads nicht gleichzeitig fertig sind, wird die Leerlaufzeit einzelner Threads durch die geringe Anzahl an Iterationen minimiert. Nachteil: Führt bei sehr kleinen Iterationsmengen zu einem erhöhten Overhead.

Guided Self-Scheduling Das Guided Self-Scheduling ist eine Mischung aus dem Static Scheduling und dem Self-Scheduling. Zu Beginn wird an die Threads eine große Anzahl von Iterationen vergeben, die dann aber progressiv immer geringer wird. Vorteil: Die Leerlaufzeit einzelner Prozessoren wird stark verringert und es ergibt sich erst am Ende der Laufzeit ein erhöhter Aufwand für die Verteilung der Iterationen (Overhead).

Variablenklassifizierung Es gibt mehrere Möglichkeiten die von der Schleife benötigten Variablen vor Race Conditions zu schützen. Loop-private Variable: Eine Variable, die ihren Wert von einer Iteration der Schleife nicht an eine andere weitergibt oder erst in der Schleife selbst deklariert wird. Beispiel: for (int i = start; i < end; i++) { float sinValue = (float)Math.sin((i % 360) * Math.PI/180.0); ... }

Variablenklassifizierung (2) Read-only Variable: Variablen, die ihren Wert während der Ausführung der Schleife nicht ändern (z.B. Konstanten). Storeback Variable: eine loop-private Variable, deren Wert nach der Ausführung der Schleife noch einmal benötigt und nach dem Schleifendurchlauf gespeichert wird.

Variablenklassifizierung (3) Reduction Variable: Falls es bei der Berechnung auf die Reihenfolge nicht ankommt (z.B. bei einer Summe) kann der Wert am Ende der Teilberechnung eines Threads (Storeback) an eine globale Variable übergeben werden. Diese Berechnung muss allerdings synchronisiert werden, um eine Race Condition zu vermeiden. Shared Variable: Anfangs sind alle Variablen im Loop shared variables. Manchmal lassen sich die shared variables leider nicht nach den oben genannten Mustern klassifizieren, da evtl. jede Iteration auf den Wert der vorigen Iteration zugreifen muss.

Analyse und Transformation des Loops Loop distribution: Es ist oftmals möglich die Berechnung der eigentlichen Schleife (des Loops) in mehrere kleine Schleifen aufzuteilen, die dann parallel laufen können. Loop isolation: Manche Schleifen lassen sich nicht parallelisieren, allerdings enthalten manche Programme mehrere voneinander unabhängige (isolierte) Schleifen, die dann parallel ausgeführt werden können.

Analyse und Transformation des Loops (2) Loop interchange: In vielen Programme trifft man auf ineinander verschachtelte Schleifen. In diesem Fall ist es meist am besten die äußerste Schleife auf mehrere Threads zu verteilen. Dies ist nicht immer sofort möglich.

Analyse und Transformation des Loops (3) Public float[] [] getValues() { for (int i = 0; i < 360; i++) { lookupValues[0] [i] = 0; } for (int j = 1; j < 1000; j++) { for (int i = 0; i < 360; i++) { float sinValue = (float)Math.sin(i % 360) * Math.PI/180.0); lookupValues[j] [i] = sinValue * (float)i / 180.0f; lookupValues[j] [i] += lookupValues[j-1] [i] * (float)j/180.0f; } } return lookupValues; }

Analyse und Transformation des Loops (4) Public float[] [] getValues() { for (int i = 0; i < 360; i++) { lookupValues[0] [i] = 0; } for (int i = 0; i < 360; i++) { for (int j = 1; j < 1000; j++) { float sinValue = (float)Math.sin(i % 360) * Math.PI/180.0); lookupValues[j] [i] = sinValue * (float)i / 180.0f; lookupValues[j] [i] += lookupValues[j-1] [i] * (float)j/180.0f; } } return lookupValues; }

Analyse und Transformation des Loops (5) Loop reimplementation: Leider ist es sehr schwierig einen Algorithmus zu implementieren, der unsere Schleifen automatisch auf mehrere Threads verteilt. Oftmals müssen Teile des Programms umgeschrieben werden (z.B. while-, bzw. do-Schleifen müssen in for-Schleifen umgeschrieben werden) oder die Berechnungen müssen auf mehrere Schleifen verteilt werden. Leider ist dies nicht immer ganz leicht möglich... (to be continued)

Exkurs: Multi-Threading Compiler Es gibt mehrere Compiler, die Java-Bytecode automatisch in Maschinencode kompilieren können. Einige dieser Compiler könne auch Single-Thread Programme automatisch auf mehrere Prozessoren (und damit Threads) verteilen. Beispiel: JET 1.01 (www.excelsior-usa.com)