HPC Software Projekt - Cheatsheet
Gemeinsam genutzter Speicher und verteilte Speicherarchitekturen
Definition:
Gemeinsam genutzter Speicher und verteilte Speicherarchitekturen beschreiben zwei Ansätze im Hochleistungsrechnen (HPC) zur Organisation von Speicherressourcen.
Details:
- Gemeinsam genutzter Speicher: Mehrere Prozessoren greifen auf denselben physischen Speicher zu.
- Einfacheres Programmiermodell
- Datenzugriff kann zu Engpässen führen
- Beispiel: Symmetric Multiprocessing (SMP)
- Verteilte Speicherarchitekturen: Jeder Prozessor hat eigenen lokalen Speicher.
- Skalierbarkeit durch Hinzufügen von Knoten
- Datenbewegung über Netzwerk notwendig
- Beispiel: Massively Parallel Processing (MPP)
Parallele Programmierung mit OpenMP und MPI
Definition:
Parallele Programmierung mit OpenMP und MPI bezieht sich auf die Verwendung von zwei weit verbreiteten Standards für paralleles Rechnen: OpenMP für gemeinsamer Speicher und MPI für verteilten Speicher.
Details:
- OpenMP: API für gemeinsame Speicherarchitektur, Verwendung von Compiler-Direktiven
- MPI: Bibliothek für verteilte Speicherarchitektur, Kommunikation zwischen Prozessen
- Synchronisation und Lastverteilung sind Schlüsselaspekte
- Typische Anwendungsgebiete: numerische Simulationen, wissenschaftliches Rechnen
- Performance-Messungen und -Optimierungen sind essentiell
Vermeidung und Behebung von Race Conditions
Definition:
Race Conditions treten auf, wenn der Output eines Programms vom zeitlichen Ablauf der Zugriffe auf geteilte Ressourcen abhängt. Diese Bedingungen können zu unvorhersehbarem Verhalten führen.
Details:
- Nutzung von Sperren (Locks), z.B. Mutexe, um den Zugang zu kritischen Abschnitten zu kontrollieren.
- Verwendung von atomaren Operationen zur Sicherstellung, dass bestimmte Aktionen unteilbar sind.
- Implementierung von Synchronisationsmechanismen wie Semaphoren und Monitore zur Koordinierung von Threads.
- Vermeidung von gemeinsam genutzten Zuständen wo möglich, z.B. durch Immutable-Objekte oder Thread-Local Storage.
- Überprüfung und Testen auf Race Conditions durch Tools wie Thread Sanitizer.
- Design-Strategien wie Erhöhung der Granularität der Sperren oder der Einsatz von Transaktionsememory (STM).
Cache-Optimierung und Speicherhierarchien
Definition:
Cache-Optimierung zielt auf die Verbesserung der Nutzung des Cache-Speichers ab, um die Gesamtleistung zu steigern. Speicherhierarchien beziehen sich auf die Strukturierung von Speicher in verschiedenen Ebenen, die sich in Größe und Zugriffsgeschwindigkeit unterscheiden.
Details:
- Lokale Datenzugriffsmuster optimieren
- Cache-Ausrichtungen beachten
- Mehrere Speicherzugriffsebenen (Register, L1, L2, L3, Hauptspeicher)
- Vermeidung von Cache-Misses (Trefferquote maximieren)
- Verwendung von Prefetching
- Speicheraffinität beachten -> Daten in der Nähe der nutzenden Prozesse platzieren
- Möglichst sequentielle Speicherzugriffe
Explizite Vektorisierung (SIMD) und Algorithmische Optimierungen
Definition:
Verwendung von SIMD-Befehlen und optimierten Algorithmen zur Beschleunigung der Rechenleistung in HPC-Anwendungen.
Details:
- SIMD (Single Instruction, Multiple Data): Parallelverarbeitung von Daten durch eine einzige Anweisung.
- Explizite Vektorisierung: Manuelles Umwandeln von Schleifen/Operationen in SIMD-kompatiblen Code.
- Algorithmische Optimierungen: Anpassung und Verbesserung von Algorithmen, um die Leistung zu steigern.
- Ziele: Reduzierung der Ausführungszeit, Minimierung des Speicherzugriffs, Erhöhung der Parallelität.
- Beispiele für SIMD: SSE, AVX von Intel; NEON von ARM.
- Typische Techniken: Unrolling, Loop Fusion, Cache-Optimierung.
Skalierungsmodelle und Metriken
Definition:
Bestimmen und bewerten die Leistungsfähigkeit von HPC-Anwendungen im Bezug auf ihre Fähigkeit, bei Erhöhung der Ressourcen effizient zu skalieren.
Details:
- Speedup: \( S(p) = \frac{T(1)}{T(p)} \)
- Parallel Efficiency: \( E(p) = \frac{S(p)}{p} \)
- Amdahls Gesetz: Effekt der seriellen Anteile auf Speedup
- Gustafson's Gesetz: Berücksichtigt variierende Problemgrößen
- Schwache Skalierung: Konstante Prozesorlast (Problemgröße wächst mit der Anzahl der Prozessoren)
- Starke Skalierung: Konstante Problemgröße unabhängig von Prozessoranzahl
Versionsverwaltung und Continuous Integration für HPC
Definition:
Versionsverwaltung (z. B. Git) und Continuous Integration (CI) (z. B. Jenkins) ermöglichen effizientes Management und Automatisierung des Entwicklungsprozesses von HPC-Software.
Details:
- Versionsverwaltung:
- Verfolgen von Codeänderungen
- Zusammenarbeit im Team
- Ermöglicht Rollbacks bei Fehlern
- Continuous Integration:
- Automatisiertes Bauen, Testen und Bereitstellen von Software
- Frühes Erkennen von Fehlern
- Hält Software stets in auslieferbarem Zustand
- Spezielle Anforderungen für HPC:
- Skalierbarkeit auf große Systeme
- Support für heterogene Umgebungen
Profiling-Tools und Leistungsmessung
Definition:
Analyse-Tools zur Bewertung und Optimierung der Performance von HPC-Anwendungen.
Details:
- Profiling-Tools: Erfassen Laufzeitdaten von Anwendungen (z.B. gprof, Intel VTune, Arm MAP).
- Leistungsmessung: Bewerten Effizienz und Skalierbarkeit (z.B. Likwid, PAPI).
- Wichtigste Metriken: Ausführungszeit, CPU-Auslastung, Speicherzugriffe, I/O-Operationen.
- Visualisierung: Hilft bei Identifikation von Engpässen (z.B. Grafiken, Heatmaps).
- Optimierung: Anhand der Daten können Codeabschnitte verbessert werden.