Datenparallele Algorithmische Skelette in Muesli Dominik Pfeiffer Münster, 31. Mai 2007
Gliederung Motivation Grundlegende Begriffe Die Skelettbibliothek Muesli Beispielprogramm Zusammenfassung und Bewertung
Motivation Probleme in der parallelen Programmierung: Synchronisation von Prozessen Deadlocks Starvation Mögliche Lösung des Problems: Von der Parallelität der Ausführung abstrahieren Auf einer höheren Ebene Funktionen zur parallelen Verarbeitung von Aufgaben und Daten bereitstellen Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Gliederung Motivation Grundlegende Begriffe Funktionen höherer Ordnung Partielle Applikationen Algorithmische Skelette Die Skelettbibliothek Muesli Beispielprogramm Zusammenfassung und Bewertung
Funktionen höherer Ordnung Funktionen mit Funktionen als Parameter oder Rückgabewerte Gleichstellung von Funktionen und Werten Beispiel: map (funktion, [liste]) map wendet eine Funktion sukzessiv auf jedes Element einer Liste an Realisierung bspw. in C++ durch Funktionszeiger Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Partielle Applikationen (1/2) Anwendung von weniger Argumenten auf eine Funktion als erwartet werden Umwandeln dieser Funktion in neue Funktion mit nur noch den fehlenden Argumenten Anwendung beliebiger Werte auf restliche Argumente führt zum selben Ergebnis wie Auflösen der Ursprungsfunktion Lässt sich beliebig frei und tief verschachteln Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Partielle Applikationen (2/2) Realisierung durch die Hilfsfunktion curry() Beispiel: Ausgangsfunktion: map (funktion, [liste]) Hilfsfunktion: mult(x, y) Anwendung von curry() auf mult(x,y) mit dem Parameter 2 liefert mult2(y) Partielle Applikation: map(curry(mult)(2), [liste]) Ergebnis: Alle Elemente der Liste werden mit 2 multipliziert Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Algorithmische Skelette (1/2) Stellen ein Gerüst für bestimmte Operationen und Kommunikationsmuster bereit Verbergen die parallele Ausführung Vermeiden unnötige Spezialisierung Können in der sequentiellen Programmierung genutzt werden Kümmern sich um Low-Level-Probleme Deadlocks Starvation Synchronisation Implementierung unter Verwendung von: Polymorphismus Funktionen höherer Ordnung Partielle Applikationen Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Algorithmische Skelette (2/2) Taskparallele Skelette Teilen Probleme in sequentiell und parallel abzuarbeitende Aufgaben Datenparallele Skelette Führen Operationen auf verteilten Datenstrukturen aus Laufen intern parallel ab Rechenskelette Bearbeiten die Inhalte der verteilten Datenstruktur Kommunikationsskelette Versenden Daten Synchronisieren Prozesse Ändern die Verteilung der Partitionen auf einzelne Prozesse Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Gliederung Motivation Grundlegende Begriffe Die Skelettbibliothek Muesli Übersicht Verteilte Datenstrukturen Map ZipWith Fold Beispielprogramm Zusammenfassung und Bewertung
Übersicht Muesli ist eine Skelettbibliothek Implementierung Algorithmische Skelette Verteilte Datenstrukturen Keine eigene Programmiersprache Implementierung C++ Interprozesskommunikation mit MPI Funktionen höherer Ordnung Partielle Applikationen Polymorphismus (Templates) Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Verteilte Datenstrukturen (1/2) Verteilte Datenstrukturen Array und Matrix Aufteilung in Partitionen Verteilung der Partitionen auf mehrere Prozesse Konstruktoren Größe der Matrix Größe der Partition Initialwert oder –funktion Hilfsfunktionen get set show … Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Verteilte Datenstrukturen (2/2) Kommunikation ist nicht erforderlich Alle Prozesse führen den gleichen Code aus Partition wird anhand der ProzessID bestimmt Alle Prozesse haben die gleiche Datenbasis Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Map (1/2) Rechenskelett Wendet eine Funktion sukzessiv auf jedes Element einer Datenstruktur an Die Anwendung kann parallel von jedem Prozess auf seiner Partition erfolgen Kommunikation ist nicht erforderlich Skelettdefinition in Muesli: DistributedMatrix<R> map (R (*f)(E)) Varianten DistributedMatrix<R> mapIndex(R (*f)(int,int,E)) void mapInPlace(E (*f)(E)) void mapIndexInPlace(E (*f)(int,int,E)) Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Map (2/2) Beispiel Multiplikation aller Elemente der Matrix mit 2 Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
ZipWith (1/2) Rechenskelett Kombiniert zwei gleiche Datenstrukturen Gleiche Größe der Matrix Gleiche Partitionierung Elementweise Kombination Kommunikation ist nicht erforderlich Skelettdefinition in Muesli: DistributedMatrix<R> zipWith ( const DistributedMatrix<E2>& b, R (*f)(E,E2)) Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
ZipWith (2/2) Beispiel: Kombination durch element-weise Multiplikation & = Prozess 1 & = = Prozess 2 & Prozess 3 & = Prozess 4 = & Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Fold (1/3) Rechenskelett Vereint alle Elemente einer Datenstruktur Nacheinander Vereinigung jedes Elements mit dem bisherigen Zwischenergebnis Die Art der Vereinigung wird durch Parameter bestimmt: Assoziative Funktion f f erwartet 2 Parameter vom Typ der Elemente der Datenstruktur Ergebnis liegt danach bei jedem Prozess vor Ergebnis = f(Elem1, f(Elem2, … f(Elemn-1, Elemn)…)) Kommunikation erforderlich Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Fold (2/3) Beispiel Schritt 1: Vereinigung der Elemente jeder lokalen Partition Schritt 2: Austausch der Zwischenergebnisse zwischen den Prozessen Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Fold (3/3) Beispiel Skelettdefinition in Muesli: Schritt 3: Vereinigung der Zwischenergebnisse durch jeden Prozess Skelettdefinition in Muesli: E fold (E (*f)(E,E)) Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Gliederung Motivation Grundlegende Begriffe Die Skelettbibliothek Muesli Beispielprogramm Hintergrund Programmablauf Implementierung Zusammenfassung und Bewertung
Hintergrund Beispielprogramm unter Verwendung der hier vorgestellten Skelette Anwendungskontext: Verschmelzen von zwei Übergangsmatrizen aus der Wahrscheinlichkeitstheorie Praktische Anwendung in der Physik bei der Beschreibung physikalischer Zustandsveränderungen Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Programmablauf Erstellen zweier 4x4-Übergangsmatrizen Matrix 1: Die ersten beiden Zeilen mit 0,5 und der Rest mit 0 belegt Matrix 2: Einheitsmatrix Kombinieren der Matrizen Berechnung der Summe aller Werte der Ergebnismatrix Die Werte müssen in der Summe 4 ergeben Stellt ansatzweise die Korrektheit der Vereinigung sicher Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Implementierung (1/5) Initialisieren der Skelettbibliothek InitSkeletons(argc, argv); Initialisieren der ersten Übergangsmatrix DistributedMatrix<double> m1(4,4,1,4); m1.mapIndexInPlace(&firsttwo); Hilfsfunktion firsttwo double firsttwo(const int a, const int b, const double d) { return (a == 0 || a == 1) ? 0.5 : 0; } m1= Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Implementierung (2/5) Initialisieren der zweiten Übergangsmatrix DistributedMatrix<double> m2(4,4,&identmx,1,4); Hilfsfunktion identmx double identmx(const int a, const int b) { return (a == b) ? 1 : 0; } Kombinieren der Matrizen m1.zipWithInPlace(m2,&combine); Hilfsfunktion combine double combine(const double a, const double b) { return ((a + b) / 2); m2= m1= Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Implementierung (3/5) Berechnung der Summe aller Werte der Ergebnismatrix double sum = m1.fold(&add); Hilfsfunktion add double add(const double a, const double b) { return a + b; } Skelettbibliothek beenden TerminateSkeletons(); m1= Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Implementierung (4/5) Vollständiger Quellcode (Teil 1) #include "Skeleton.h" double firsttwo(const int a, const int b, const double d) { return (a == 0 || a == 1) ? 0.5 : 0;} double identmx(const int a, const int b) { return (a == b) ? 1 : 0;} double combine(const double a, const double b) { return ((a + b) / 2);} double add(const double a, const double b) { return a + b;} (…) Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Implementierung (5/5) Vollständiger Quellcode (Teil 2) int main(int argc, char **argv) { InitSkeletons(argc, argv); // Initialisieren der Skelette DistributedMatrix<double> M1(4, 4, 1, 4); // Initialisieren der Matrizen M1.mapIndexInPlace(&firsttwo); DistributedMatrix<double> M2(4, 4, &identmx, 1, 4); M1.zipWithInPlace(M2, &combine); // Kombinieren der Matrizen double sum = M1.fold(&add); // Summe der Werte bilden TerminateSkeletons(); // Skelettbibliothek beenden } Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Gliederung Motivation Grundlegende Begriffe Die Skelettbibliothek Muesli Beispielprogramm Zusammenfassung und Bewertung
Bewertung (Positiv) Abstraktion von Low-Level-Programmierung Deadlocks, Starvation, Synchronisation Jedes Skelett als Funktion höherer Ordnung und als partielle Applikation verfügbar Einheitliche Namensgebung bei Endungen -Index -InPlace Programmierer kann weiterhin sequentiell arbeiten Nur noch Bereitstellen einer adäquaten problemspezifischen Funktion durch den Entwickler Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Bewertung (Negativ) Anzahl beteiligter Prozesse muss Potenz zur Basis 2 sein Keine freie Partitionierung Größe der Partition muss Teiler der Größe der Datenstruktur sein Anzahl der Partitionen muss gleich Anzahl der Prozesse sein Alle Partitionen müssen gleich groß sein Keine automatische Partitionierung Mögliche Schwierigkeiten beim Kompilieren GNU Compiler G++ 3.3.3 MPI 1.2.x Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Zusammenfassung Algorithmische Skelette Muesli Gerüst für die parallele Verarbeitung Hohes Abstraktionsniveau Effizient implementiert Polymorphismus, Funktionen höherer Ordnung und partielle Applikationen Nutzung wie bei sequentieller Programmierung möglich Muesli Keine eigene Programmiersprache, sondern Bibliothek Verteilte Datenstrukturen Array und Matrix Konstruktoren und Hilfsfunktionen Rechen- und Kommunikationsskelette Bereitstellen einer adäquaten problemspezifischen Funktion durch den Entwickler Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung
Vielen Dank für eure Aufmerksamkeit!
PermutePartition Kommunikationsskelett Ändert die Verteilung der Partitionen auf die Prozesse Erwartet bijektive Funktionen als Parameter
Global vs. Lokal Wahl zwischen der Betrachtungsweise des Problems Index der verteilten Datenstruktur Geeignet für die Lösung eines Problems im Gesamtzusammenhang Lokal Index der lokalen Partition Geeignet für Optimierungen Motivation – Grundlegende Begriffe – Die Skelettbibliothek Muesli – Beispielprogramm – Zusammenfassung