Parallele Programmierung mit C++
Ziel der Vorlesung ist es, parallele Anwendungen insbesondere auf technischer Ebene zu modellieren und effizient zu implementieren. Die Inhalte sind sehr praxisorientiert und bieten eine Übersicht der gängigsten Parallelisierungstechniken und Architekturen. C++ kommt hier zum Einsatz, da es die einzige moderne Programmiersprache ist, die bei allen vorgestellten Techniken eingesetzt werden kann.
Termine
- Vorlesung: Donnerstag, 16–18 Uhr, Helmholtzstraße 18, Raum E.60.
- Übungen: Freitag, 14-16 Uhr, Helmholtzstraße 18, Raum E.44.
Inhalt
- Modellierung paralleler Systeme mit der Prozessalgebra CSP
- Architekturen paralleler Systeme, Speichermodelle
- Parallelisierungstechniken: Threads, OpenMP, MPI, GPUs mit CUDA und OpenCL
- Design-Patterns paralleler Systeme
Voraussetzungen
Es werden einführende Vorlesungen in die praktische Informatik vorausgesetzt. Hilfreich (aber nicht zwingend notwendig) wären grundlegende Kenntnisse in
- systemnaher Programmierung,
- Unix/Linux einschließlich der Shell-Ebene und
- Netzwerkprogrammierung, insbesondere TCP/IP und BSD-Sockets, wie sie beispielsweise in Systemnahe Software II vermittelt werden.
Eine Einführung in C++ findet zu Beginn in den Übungen statt. Wer keine Vorkenntnisse zu C++ hat, sollte diese Gelegenheit nutzen.
Prüfungen
Die Vorlesung ist für die Master-Studiengänge Mathematik, Wirtschaftsmathematik, Informatik und Medieninformatik vorgesehen. Bei den Bachelor-Studiengängen Informatik und Software-Engineering kann dies als Schwerpunktfach gewählt werden. (Die Einzelheiten dazu lassen sich dem Modulhandbuch entnehmen.) Die Prüfung erfolgt mündlich zu individuell verabredeten Terminen.
Vorlesungen
Begleitend zur Vorlesungen werden hier kapitelweise die zugehörigen Vortragsfolien und ggf. weitere Materialien veröffentlicht:
- 25. April 2019: Syllabus und Einführung zu CSP (aktualisiert am 2. Mai 2019)
- 2. Mai 2019: Einführung zur Architektur von Parallelrechnern
- 9. Mai 2019: Einführung zu Threads
- 16. Mai 2019: Mutex- und Bedingungsvariablen, mandelbrot.tar.gz
- 24. Mai 2019: Master/Worker-Pattern, Thread-Pools, std::future & std::promise, thread_pool.hpp
- 6. Juni 2019: MP-Systeme mit gemeinsamen Speicher (1. Teil)
- 7. Juni 2019: MP-Systeme mit gemeinsamen Speicher (2. Teil)
- 13. Juni 2019: Einführung zu OpenMP, Beispiel: openmp-rootfinder.tar.gz
- 27. Juni 2019: Einführung zu MPI
- 28. Juni 2019: Semantik von MPI_Send und MPI_Recv, Scatter/Gather-Pattern, Übertragung von Vektoren und Matrizen
- 4. Juli 2019: Partitionierungs- und Kommunikationsstrategien bei MPI; Beispiele: mpi-jacobi.cpp, mpi-jacobi-nb.cpp, mpi-jacobi-2d.cpp
- 12. Juli 2019: Einführung zu CUDA
- 18. Juli 2019: Speicherorganisation auf einer GPU, Cache-Optimierung mit Hilfe gemeinsamen Speichers, cuda-gemm.tar.gz
- 25. Juli 2019: Parallelisieren und Synchronisieren mit CUDA-Streams, pinned and mapped memory
- 26. Juli 2019: Nachtrag zur Vorlesung vom 25. Juli, cuda-gemm-streamed.tar.gz
- Alle Folien in einem PDF-Dokument (Stand: 26. Juli 2019)
Übungen
- Melden Sie sich bitte für die Teilnahme in den Übungen bei SLC an.
- Die Übungen sind zeitintensiv und integraler Teil einer praxisorientierten Vorlesung. Die Inhalte aus den Übungen sind prüfungsrelevant, die Teilnahme an den Übungen ist aber nicht Voraussetzung zur Prüfungsanmeldung.
Folien zur Einführung in C++:
- 26. April 2019: Erste Schritte mit C++
- 3. Mai 2019: Einführung zu Klassen in C++
- 10. Mai 2019: Lambda-Ausdrücke
- 17. Mai 2019: Generische Deklarationen
- Alle Folien in einem PDF-Dokument (Stand: 17. Mai 2019)
Übungssitzungen:
- 26. April 2019: Erste Schritte mit C++
- 3. Mai 2019: Spezielle Methoden einer Klasse
- 10. Mai 2019: Verwaltung von Ressourcen durch Objekte
- 17. Mai 2019: Template-Klassen und -Funktionen
- 28. Juni 2019: Einführung zu MPI, Übertragung von Vektoren und Matrizen mit MPI
- 5. Juli 2019: Scatter/Gather, asynchrone Kommunikation und zweidimensionale Gitter mit MPI
- 12. Juli 2019: Einführung zu CUDA
- 19. Juli 2019: Matrizen und blockweise Operationen auf der GPU, Globale Synchronisierung und zweidimensionale Aggregierung
Übungsblätter:
Blatt | Ausgabe | Abgabe | Material | Lösung | |
---|---|---|---|---|---|
1 | 26. April 2019 | 3. Mai 2019 | blatt01.pdf | automat.csp, fehlfunktion.csp | |
2 | 3. Mai 2019 | 10. Mai 2019 | blatt02.pdf | handshake.csp, dnsreq.csp | |
3 | 10. Mai 2019 | 17. Mai 2019 | blatt03.pdf | copyfile.cpp, mapped_file.hpp, readfile.cpp, regextest.cpp | engine.hpp, pgrep.cpp |
4 | 17. Mai 2019 | 24. Mai 2019 | blatt04.pdf | condition.hpp | condition.cpp, testit.cpp |
5 | 24. Mai 2019 | 7. Juni 2019 | blatt05.pdf | gdk-pixbuf-demo.tar, gen-mp.pl | |
6 | 13. Juni 2019 | 27. Juni 2019 | blatt06.pdf | omp-jacobi.cpp | |
7 | 5. Juli 2019 | 12. Juli 2019 | blatt07.pdf | ||
8 | 12. Juli 2019 | 19. Juli 2019 | blatt08.pdf | vorlage.tar.gz | |
9 | 26. Juli 2019 | blatt09.pdf |
Materialien
- Communicating Sequential Processes (Online-Fassung des Buchs von Tony Hoare über CSP)
- Implementierung einer Teilmenge von CSP
- ISO/IEC 14882 (C++ Standard, Arbeitsfassung vom 21. März 2017 kurz vor dem C++17-Standard)
- Thread-Pools
Kontakt
Dr. Andreas F. Borchert
Helmholtzstr. 20
Raum 1.23