Pause bei: Folie 25
Parallel High Performance Computing - Vorlesungszusammenfassung
Inhaltsverzeichnis
- Einführung in Parallel Computing
- Definitions and Terminology
- Amdahls Gesetz
- Gustafsons Gesetz
- Skalierungsarten
- Superlineare Beschleunigung
- Programmierung von Shared Memory Systemen
- Parallel Algorithms
- Plattformen in Common Use Today
- Herausforderungen in Parallel Computing
- Glossar
- Quellen
- Weiterführende Literatur
Einführung in Parallel Computing
Parallel Computing beschäftigt sich mit der gleichzeitigen Ausführung von Berechnungen auf mehreren Prozessoren, um die Leistung zu steigern. Es ist essentiell, um die Leistungsgrenzen moderner und zukünftiger Multicore-Systeme auszunutzen.
Ziele:
- Leistungssteigerung: Schnellere Lösung von Problemen (Zeit bis zur Lösung verkürzen).
- Skalierbarkeit: Fähigkeit, größere Probleme mit zunehmender Anzahl von Kernen zu lösen.
- Qualitätsverbesserung: Durchführung mehrerer Programmläufe zur Verbesserung der Genauigkeit oder Fehlergrenzen.
Definitions and Terminology
Distributed, Concurrent und Parallel Computing
-
Concurrent Computing:
- Mehrere Threads interagieren gleichzeitig, oft zur Verbesserung der Systemdesigns und Benutzerfreundlichkeit.
- Beispiele:
- GUI-Anwendungen: Benutzeroberfläche und Hintergrundprozesse laufen parallel.
- Online Transaction Processing Systems (OLTP): Gleichzeitige Verarbeitung von Transaktionen.
-
Distributed Computing:
- Anwendungen bestehen aus geografisch verteilten Komponenten.
- Beispiele:
- Client-/Server-Modelle
- Web-, Grid- und Cloud-Systeme
-
Parallel Computing:
- Nutzung mehrerer Prozessorkerne zur Leistungssteigerung und Skalierbarkeit.
- Fokus des Kurses!
Speedup und Effizienz
-
Speedup ():
- : Ausführungszeit auf einem Kern (sequentielle Ausführung)
- : Ausführungszeit auf Kernen
- Typischerweise
- Superlinear Speedup:
-
Effizienz ():
- Typischerweise
Beispiel:
Prozessoren (n) | Zeit (Sek.) | Speedup | Effizienz |
---|---|---|---|
1 | 100 | 1.00 | 1.00 |
2 | 55 | 1.82 | 0.91 |
5 | 28 | 3.57 | 0.71 |
10 | 19 | 5.26 | 0.53 |
Amdahls Gesetz
Amdahls Gesetz beschreibt die theoretische maximale Beschleunigung, die durch Parallelisierung eines Programms erreicht werden kann, basierend auf dem sequenziellen Anteil des Programms.
- : Anteil des Programms, der sequentiell ist.
- : Anzahl der Prozessoren.
Beispiele:
- 10% sequentiell ():
- 5% sequentiell ():
Schlussfolgerung: Selbst ein kleiner sequentieller Anteil kann die maximale Beschleunigung stark begrenzen.
Gustafsons Gesetz
Gustafsons Gesetz erweitert Amdahls Ansatz, indem es annimmt, dass der Problemumfang mit der Anzahl der Prozessoren wächst.
- : Anzahl der Prozessoren.
- : Anteil des Programms, der sequentiell ist.
Schlüsselidee: Statt die Ausführungszeit konstant zu halten, erhöht man den Problemumfang proportional zur Anzahl der Prozessoren, um eine höhere Auslastung zu erreichen.
Quelle: Wikipedia
Skalierungsarten
Starke Skalierung
- Definition: Versuch, die Ausführungszeit eines festen Problems durch Hinzufügen weiterer Prozessoren zu reduzieren.
- Ziel: Lineare Reduktion der Ausführungszeit mit der Anzahl der Prozessoren.
- Herausforderung: Sequentieller Anteil begrenzt den erreichbaren Speedup.
Schwache Skalierung
- Definition: Beibehaltung der Ausführungszeit bei proportionaler Erhöhung des Problemumfangs und der Prozessoranzahl.
- Ziel: Effiziente Nutzung der zusätzlichen Ressourcen ohne Erhöhung der Ausführungszeit.
Superlineare Beschleunigung
Superlinear Speedup tritt auf, wenn der Speedup größer als die Anzahl der hinzugefügten Prozessoren ist ().
Ursachen:
- Verbesserte Cachesysteme: Durch Hinzufügen weiterer Prozessoren erhöht sich die Gesamtspeicherkapazität (Cache), wodurch mehr Daten im schnellen Cache gehalten werden können.
Beispiel: Ein Programm, das auf einem einzelnen Kern aufgrund von Cache-Mangel langsam ist, könnte auf mehreren Kernen mit größerem Gesamtspeicher schneller laufen, da mehr Daten im Cache gehalten werden können.
Programmierung von Shared Memory Systemen
Threads und Synchronisation
- Threads: Kleine Ausführungseinheiten innerhalb eines Prozesses, die parallel laufen können.
- Private Variablen: Jede Thread hat ihre eigenen Kopien dieser Variablen (z.B. lokale Stack-Variablen).
- Shared Variablen: Alle Threads teilen sich diese Variablen (z.B. globale Variablen, Heap-Speicher).
Kommunikation zwischen Threads: Durch Lesen und Schreiben von Shared Variablen.
Synchronisationsmechanismen:
- Locks (Mutexe): Sicherstellen, dass nur ein Thread gleichzeitig auf eine Shared Ressource zugreifen kann.
- Barriers: Synchronisationspunkte, an denen alle Threads warten, bis jeder Thread einen bestimmten Punkt erreicht hat.
Pthreads
Pthreads (POSIX Threads) ist ein Standard zur Thread-Programmierung, der in Unix-ähnlichen Betriebssystemen weit verbreitet ist.
Grundlegende Funktionen:
pthread_create()
: Erstellen eines neuen Threads.pthread_join()
: Warten auf die Beendigung eines Threads.pthread_mutex_lock()
/pthread_mutex_unlock()
: Verwenden von Mutexen zur Synchronisation.
Beispiel: Erstellen und Beenden von Threads
Herausforderungen:
- Deadlocks: Tritt auf, wenn zwei oder mehr Threads gegenseitig auf Ressourcen warten, die von den anderen gehalten werden.
- Lösung: Konsistente Reihenfolge beim Erwerb von Locks.
- Data Races: Gleichzeitiger Zugriff auf Shared Variablen ohne angemessene Synchronisation kann zu inkonsistenten Zuständen führen.
OpenMP
OpenMP ist eine API zur Parallelisierung von C, C++ und Fortran Programmen auf Shared Memory Systemen.
Kernkomponenten:
- Compiler Directives: Spezielle Anweisungen, die dem Compiler Parallelisierungsinformationen geben.
- Library Routines: Funktionen zur Kontrolle der Parallelität.
- Environment Variables: Einstellungen, die das Verhalten der Parallelisierung steuern.
Beispiel: Parallelisierte Schleife mit OpenMP
Wichtige Konzepte:
- Parallel Regions: Abschnitte des Codes, die parallel ausgeführt werden.
- Loop Parallelism: Automatische Aufteilung von Schleifeniterationen auf Threads.
Vorteile:
- Einfache Parallelisierung bestehender Programme durch Hinzufügen von Compiler Directives.
- Automatische Lastverteilung und Synchronisation.
Parallel Algorithms
Task Decomposition
- Definition: Unterteilung eines Problems in kleinere, unabhängige Aufgaben, die parallel ausgeführt werden können.
- Granularität:
- Fein granular: Große Anzahl kleiner Aufgaben.
- Groß granular: Kleine Anzahl großer Aufgaben.
Beispiel: Matrix-Vektor-Produkt
- Sehr fein granular: Jede Multiplikation ist unabhängig.
- Fein granular: Jede Zeile der Matrix wird separat berechnet.
- Groß granular: Blöcke von Zeilen werden berechnet.
- Sequenziell: Das gesamte Matrix-Vektor-Produkt als eine einzige Aufgabe.
Task Dependency Graph
- Definition: Darstellung von Abhängigkeiten zwischen Aufgaben in Form eines gerichteten azyklischen Graphen (DAG).
- Arten der Dekomposition:
- Statische Dekomposition: Aufgaben und ihre Abhängigkeiten sind vor Beginn der Ausführung bekannt.
- Dynamische Dekomposition: Aufgaben können während der Ausführung neue Aufgaben generieren.
Beispiel: Cholesky-Faktorisierung Quelle: Jack Dongarra, ICL
Task Interaction Graph
- Definition: Formalisiert Interaktionen zwischen Aufgaben, die keine direkten Abhängigkeiten sind.
- Beispiele:
- Mehrere Aufgaben greifen auf dieselben Datenpunkte zu (z.B. Lesen derselben Matrixelemente in einem sparsamen Matrix-Vektor-Produkt).
Beispiel: Sparse Matrix-Vector Multiplikation
- Task : Verantwortlich für die Berechnung der -ten Zeile.
- Interaktion: Lesen der Einträge von durch verschiedene Tasks.
Decomposition Techniques
- Data Decomposition (Domain Decomposition): Aufteilung der Daten in Teile, die von verschiedenen Threads bearbeitet werden.
- Recursive Decomposition:
- Definition: Teilung eines Problems in kleinere Teilprobleme, die rekursiv gelöst werden.
- Beispiel: Quicksort.
- Functional Decomposition:
- Definition: Aufteilung der Aufgaben basierend auf verschiedenen Funktionen oder Aufgabenbereichen.
- Beispiel: Pipelining.
- Exploratory Decomposition:
- Definition: Aufteilung des Lösungsraums, oft in Form von Suchbäumen.
- Beispiel: 15-Puzzle Problem.
- Speculative Decomposition:
- Definition: Vorab-Berechnung mehrerer möglicher Ergebnisse zur späteren Auswahl.
Exploratory Decomposition
- Definition: Parallelisierung der Suche in einem Suchraum.
- Beispiel: 15-Puzzle Problem.
- Eigenschaften:
- Suche wird abgebrochen, sobald eine Lösung gefunden ist.
- Nicht alle Aufgaben tragen zur finalen Lösung bei (anders als bei der Daten-Dekomposition).
Speedup und Effizienz
Formeln
- Speedup ():
- Effizienz ():
- Amdahls Gesetz:
- : Zeit für den sequentiellen Teil.
- : Zeit für den parallelisierten Teil.
Beispiel
Prozessoren (n) | Zeit (Sek.) | Speedup | Effizienz |
---|---|---|---|
1 | 100 | 1.00 | 1.00 |
3 | 40 | 2.50 | 0.83 |
9 | 20 | 5.00 | 0.56 |
∞ | 10 | 10.00 | 0.00 |
Interpretation: Mit zunehmender Anzahl von Prozessoren sinkt die Effizienz, da der sequentielle Anteil des Programms den Speedup begrenzt.
Amdahls Gesetz
Amdahls Gesetz besagt, dass der erreichbare Speedup durch Parallelisierung durch den sequentiellen Anteil des Programms begrenzt ist.
- Formel:
- : Sequentieller Anteil des Programms.
- : Anzahl der Prozessoren.
Beispiele:
- 10% sequentiell: Maximaler Speedup = 10.
- 5% sequentiell: Maximaler Speedup = 20.
Warum Systeme mit vielen Kernen bauen?
- Gustafsons Gesetz: Erlaubt die Skalierung mit wachsendem Problemumfang, sodass mehr Kerne genutzt werden können, ohne dass die Effizienz drastisch sinkt.
Weak and Strong Scaling
Starke Skalierung
- Definition: Halten des Problemumfangs konstant und Reduktion der Ausführungszeit durch Hinzufügen weiterer Prozessoren.
- Ziel: Lineare Reduktion der Ausführungszeit mit der Anzahl der Prozessoren.
- Herausforderung: Sequentieller Anteil des Programms begrenzt den Speedup.
Schwache Skalierung
- Definition: Proportionale Erhöhung des Problemumfangs zur Anzahl der Prozessoren, um eine konstante Ausführungszeit zu erreichen.
- Ziel: Effiziente Nutzung zusätzlicher Ressourcen ohne Erhöhung der Ausführungszeit.
Schwierigkeit: Starke Skalierung ist schwieriger zu erreichen, da der sequentielle Anteil die maximale Beschleunigung limitiert.
Plattformen in Common Use Today
Hardware View
- Hauptkategorien:
- Shared Memory:
- Definition: Hauptspeicher (RAM) wird physisch geteilt, alle CPU-Kerne können direkt darauf zugreifen.
- Distributed Memory:
- Definition: Hauptspeicher (RAM) ist physisch verteilt, jeder CPU-Kern kann nur auf einen Teil davon zugreifen.
- Shared Memory:
Shared Memory
-
Uniform Memory Access (UMA):
- Definition: Gleichmäßiger Zugriff auf den Speicher, alle Speicherbereiche sind mit gleicher Geschwindigkeit zugänglich.
-
Non-Uniform Memory Access (NUMA):
- Definition: Ungleichmäßiger Zugriff auf den Speicher, einige Teile des Speichers sind schneller zugänglich als andere.
Software View
-
Hauptkategorien:
- Threading-Based:
- Definition: Programm besteht aus mehreren Threads mit geteilten und privaten Daten.
- Beispiele: OpenMP, Pthreads, Java/C++ Threads, Distributed Shared Memory, Cluster OpenMP, Partitioned Global Address Space.
- Message Passing-Based:
- Definition: Programm besteht aus mehreren Prozessen mit privaten Daten, Kommunikation erfolgt explizit durch Nachrichten.
- Beispiele: CSP (Communicating Sequential Processes) wie Go, Erlang, MPI (Message Passing Interface).
- Threading-Based:
Plattformen Übersicht
-
Shared Memory:
- Threading: OpenMP, Pthreads, Java/C++ Threads.
- Distributed Shared Memory: Cluster OpenMP, Partitioned Global Address Space.
-
Message Passing:
- CSP: Go, Erlang.
- MPI: Message Passing Interface.
Parallel Algorithms
Task Decomposition
- Definition: Unterteilung eines Problems in kleinere, unabhängige Aufgaben (Tasks), die parallel ausgeführt werden können.
- Granularität:
- Fein granular: Große Anzahl kleiner Aufgaben.
- Groß granular: Kleine Anzahl großer Aufgaben.
Beispiel: Matrix-Vektor-Produkt
- Sehr fein granular: Jede Multiplikation ist unabhängig.
- Fein granular: Jede Zeile der Matrix wird separat berechnet.
- Groß granular: Blöcke von Zeilen werden berechnet.
- Sequenziell: Das gesamte Matrix-Vektor-Produkt als eine einzige Aufgabe.
Task Dependency Graph
- Definition: Darstellung von Abhängigkeiten zwischen Aufgaben in Form eines gerichteten azyklischen Graphen (DAG).
- Arten der Dekomposition:
- Statische Dekomposition: Aufgaben und ihre Abhängigkeiten sind vor Beginn der Ausführung bekannt.
- Dynamische Dekomposition: Aufgaben können während der Ausführung neue Aufgaben generieren.
Beispiel: Cholesky-Faktorisierung Quelle: Jack Dongarra, ICL
Task Interaction Graph
- Definition: Formalisiert Interaktionen zwischen Aufgaben, die keine direkten Abhängigkeiten sind.
- Beispiele:
- Mehrere Aufgaben greifen auf dieselben Datenpunkte zu (z.B. Lesen derselben Matrixelemente in einem sparsamen Matrix-Vektor-Produkt).
Beispiel: Sparse Matrix-Vector Multiplikation
- Task : Verantwortlich für die Berechnung der -ten Zeile.
- Interaktion: Lesen der Einträge von durch verschiedene Tasks.
Decomposition Techniques
- Data Decomposition (Domain Decomposition): Aufteilung der Daten in Teile, die von verschiedenen Threads bearbeitet werden.
- Recursive Decomposition:
- Definition: Teilung eines Problems in kleinere Teilprobleme, die rekursiv gelöst werden.
- Beispiel: Quicksort.
- Functional Decomposition:
- Definition: Aufteilung der Aufgaben basierend auf verschiedenen Funktionen oder Aufgabenbereichen.
- Beispiel: Pipelining.
- Exploratory Decomposition:
- Definition: Aufteilung des Lösungsraums, oft in Form von Suchbäumen.
- Beispiel: 15-Puzzle Problem.
- Speculative Decomposition:
- Definition: Vorab-Berechnung mehrerer möglicher Ergebnisse zur späteren Auswahl.
Exploratory Decomposition
- Definition: Parallelisierung der Suche in einem Suchraum.
- Beispiel: 15-Puzzle Problem.
- Eigenschaften:
- Suche wird abgebrochen, sobald eine Lösung gefunden ist.
- Nicht alle Aufgaben tragen zur finalen Lösung bei (anders als bei der Daten-Dekomposition).
Speedup und Effizienz
Formeln
- Speedup ():
- Effizienz ():
- Amdahls Gesetz:
- : Zeit für den sequentiellen Teil.
- : Zeit für den parallelisierten Teil.
Beispiel
Prozessoren (n) | Zeit (Sek.) | Speedup | Effizienz |
---|---|---|---|
1 | 100 | 1.00 | 1.00 |
3 | 40 | 2.50 | 0.83 |
9 | 20 | 5.00 | 0.56 |
∞ | 10 | 10.00 | 0.00 |
Interpretation: Mit zunehmender Anzahl von Prozessoren sinkt die Effizienz, da der sequentielle Anteil des Programms den Speedup begrenzt.
Amdahls Gesetz
Amdahls Gesetz besagt, dass der erreichbare Speedup durch Parallelisierung durch den sequentiellen Anteil des Programms begrenzt ist.
- Formel:
- : Sequentieller Anteil des Programms.
- : Anzahl der Prozessoren.
Beispiele:
- 10% sequentiell ():
- 5% sequentiell ():
Warum Systeme mit vielen Kernen bauen?
- Gustafsons Gesetz: Erlaubt die Skalierung mit wachsendem Problemumfang, sodass mehr Kerne genutzt werden können, ohne dass die Effizienz drastisch sinkt.
Weak and Strong Scaling
Starke Skalierung
- Definition: Halten des Problemumfangs konstant und Reduktion der Ausführungszeit durch Hinzufügen weiterer Prozessoren.
- Ziel: Lineare Reduktion der Ausführungszeit mit der Anzahl der Prozessoren.
- Herausforderung: Sequentieller Anteil des Programms begrenzt den Speedup.
Schwache Skalierung
- Definition: Proportionale Erhöhung des Problemumfangs zur Anzahl der Prozessoren, um eine konstante Ausführungszeit zu erreichen.
- Ziel: Effiziente Nutzung zusätzlicher Ressourcen ohne Erhöhung der Ausführungszeit.
Schwierigkeit: Starke Skalierung ist schwieriger zu erreichen, da der sequentielle Anteil die maximale Beschleunigung limitiert.
Plattformen in Common Use Today
Hardware View
- Hauptkategorien:
- Shared Memory:
- Definition: Hauptspeicher (RAM) wird physisch geteilt, alle CPU-Kerne können direkt darauf zugreifen.
- Distributed Memory:
- Definition: Hauptspeicher (RAM) ist physisch verteilt, jeder CPU-Kern kann nur auf einen Teil davon zugreifen.
- Shared Memory:
Shared Memory
-
Uniform Memory Access (UMA):
- Definition: Gleichmäßiger Zugriff auf den Speicher, alle Speicherbereiche sind mit gleicher Geschwindigkeit zugänglich.
-
Non-Uniform Memory Access (NUMA):
- Definition: Ungleichmäßiger Zugriff auf den Speicher, einige Teile des Speichers sind schneller zugänglich als andere.
Software View
-
Hauptkategorien:
- Threading-Based:
- Definition: Programm besteht aus mehreren Threads mit geteilten und privaten Daten.
- Beispiele: OpenMP, Pthreads, Java/C++ Threads, Distributed Shared Memory, Cluster OpenMP, Partitioned Global Address Space.
- Message Passing-Based:
- Definition: Programm besteht aus mehreren Prozessen mit privaten Daten, Kommunikation erfolgt explizit durch Nachrichten.
- Beispiele: CSP (Communicating Sequential Processes) wie Go, Erlang, MPI (Message Passing Interface).
- Threading-Based:
Plattformen Übersicht
-
Shared Memory:
- Threading: OpenMP, Pthreads, Java/C++ Threads.
- Distributed Shared Memory: Cluster OpenMP, Partitioned Global Address Space.
-
Message Passing:
- CSP: Go, Erlang.
- MPI: Message Passing Interface.
Herausforderungen in Parallel Computing
Deadlocks
Ein Deadlock tritt auf, wenn zwei oder mehr Threads sich gegenseitig blockieren, indem jeder Thread auf eine Ressource wartet, die von einem anderen gehalten wird.
Beispiel:
- Thread 1: Sperrt Ressource A und wartet auf Ressource B.
- Thread 2: Sperrt Ressource B und wartet auf Ressource A.
Lösungen:
- Lock Ordering: Immer Ressourcen in der gleichen Reihenfolge sperren.
- Timeouts: Threads geben auf, wenn sie zu lange warten.
- Deadlock Detection: Laufzeitüberwachung zur Erkennung und Behebung von Deadlocks.
Datenrennen (Data Races)
Ein Datenrennen tritt auf, wenn mehrere Threads gleichzeitig auf dieselbe Variable schreiben oder lesen, ohne angemessene Synchronisation.
Konsequenzen:
- Inkonsistente oder unerwartete Programmzustände.
- Schwierige Fehlerdiagnose und Reproduzierbarkeit.
Vermeidung:
- Verwendung von Mutexen oder anderen Synchronisationsmechanismen.
- Gestaltung von Programmen, die keine gemeinsamen Ressourcen benötigen (z.B. funktionale Programmierung).
Glossar
- Speedup: Maß für die Beschleunigung eines Programms durch Parallelisierung.
- Effizienz: Verhältnis von Speedup zur Anzahl der verwendeten Prozessoren.
- Amdahls Gesetz: Theoretische Obergrenze des Speedups durch Parallelisierung.
- Gustafsons Gesetz: Erweiterung von Amdahls Gesetz, die den wachsenden Problemumfang berücksichtigt.
- Deadlock: Zustand, in dem zwei oder mehr Threads sich gegenseitig blockieren.
- Data Race: Gleichzeitiger, unkontrollierter Zugriff mehrerer Threads auf eine gemeinsame Ressource.
- Granularität: Maß für die Größe der Aufgaben bei der Dekomposition (fein vs. grob).
- Mutex: Mechanismus zur Synchronisation von Threads, der den exklusiven Zugriff auf eine Ressource gewährleistet.
- Barrier: Synchronisationspunkt, an dem alle Threads warten, bis jeder Thread einen bestimmten Punkt erreicht hat.
Glossar
- Speedup: Maß für die Beschleunigung eines Programms durch Parallelisierung.
- Effizienz: Verhältnis von Speedup zur Anzahl der verwendeten Prozessoren.
- Amdahls Gesetz: Theoretische Obergrenze des Speedups durch Parallelisierung.
- Gustafsons Gesetz: Erweiterung von Amdahls Gesetz, die den wachsenden Problemumfang berücksichtigt.
- Deadlock: Zustand, in dem zwei oder mehr Threads sich gegenseitig blockieren.
- Data Race: Gleichzeitiger, unkontrollierter Zugriff mehrerer Threads auf eine gemeinsame Ressource.
- Granularität: Maß für die Größe der Aufgaben bei der Dekomposition (fein vs. grob).
- Mutex: Mechanismus zur Synchronisation von Threads, der den exklusiven Zugriff auf eine Ressource gewährleistet.
- Barrier: Synchronisationspunkt, an dem alle Threads warten, bis jeder Thread einen bestimmten Punkt erreicht hat.
Fazit
Diese Markdown-Zusammenfassung deckt die wesentlichen Konzepte und Terminologien der Vorlesung “Parallel High Performance Computing” ab. Sie bietet eine strukturierte Übersicht über die Grundlagen des Parallelcomputings, die verschiedenen Skalierungsarten, Algorithmen zur Aufgaben-Dekomposition sowie die gängigen Plattformen und Herausforderungen. Für ein tieferes Verständnis und praktische Anwendungen wird empfohlen, die Vorlesungsunterlagen und die weiterführende Literatur zu konsultieren.