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
Termine:
- Vorlesung: Donnerstag, 10-12 Uhr, Helmholtzstraße 22, Raum E.03.
- Übungen: Freitag, 14-16 Uhr, Helmholtzstraße 18, Raum E.20. Am 26. Mai und am 16. Juni finden keine Übungen statt.
Da die Vorlesungstermine am 25. Mai und am 15. Juni wegen Feiertagen ausfallen, werden diese in anderen Wochen nachgeholt, indem der Übungstermin am Freitag für die Vorlesung genutzt wird. Die am 25. Mai ausgefallene Vorlesung wird am Freitag, den 2. Juni, zum Termin der Übungen nachgeholt. Die am 15. Juni wegen Fronleichnam ausfallende Vorlesung wird am Freitag, den 23. Juni, zum Termin der Übungen nachgeholt.
Der erste Vorlesungstermin ist am 20. April 2017.
Die letzte Vorlesung ist am 20. Juli 2017, die letzten Übungen am 14. Juli 2017.
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:
- 20. und 27. April 2017: Syllabus und Einführung zu CSP, Vorlesungsbeispiel: Implementierung einer Teilmenge von CSP (sowohl die Folien als auch die Implementierung wurden am 25. April korrigiert)
- 4. Mai 2017: Erster Überblick zur Architektur von Parallelrechnern und Einführung zu Threads, Beispiel: thread-overhead.cpp
- 11. Mai 2017: Mutex- und Bedingungsvariablen
- 18. Mai 2017: Thread-Pools (Beispiel: mt::thread_pool)
- 1. Juni 2017: MP-Systeme mit gemeinsamen Speicher (Teil 1), Beispiele: pointer-chasing
- 2. Juni 2017: MP-Systeme mit gemeinsamen Speicher (Teil 2)
- 8. Juni 2017: Transactional Memory, Einführung zu OpenMP
- 22. Juni 2017: Teile-und-Herrsche-Pattern mit OpenMP
- 23. Juni 2017: Einführung zu MPI (Beispiele: mpi-chase.tar.gz, mpi-simpson.cpp, mpi-gemv.tar.gz)
- 29. Juni 2017: Kommunikation bei MPI, Scatter/Gather, MPI-Datentypen, Kommunikationsgraphen, Beispiele: jacobi.cpp, jacobi-nb.cpp, jacobi-2d.cpp (jeweils unter Verwendung der HPC-Vorlesungsbibliothek)
- 6. Juli 2017: Einführung zu GPUs und CUDA, Beispiele: properties.cu, simpson.cu und simpson2.cu
- 13. Juli 2017: Matrix-Matrix-Multiplikation auf der GPU, Parallelisierung von Berechnungen und Datentransfers, Beispiele: gemm1.hpp, gemm2.hpp und test-gemm.cu
- Alle Folien in einer PDF-Datei (Stand: 13. Juli 2017)
Ü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++:
- 21. April 2017: Erste Schritte mit C++
- 28. April 2017: Einführung zu den Klassen in C++, dynamischer Polymorphismus
- 5. Mai 2017: Einführung zu λ-Ausdrücken in C++
- 12. Mai 2017: Intelligente Zeiger in C++
- Alle Folien in einer PDF-Datei (Stand: 12. Mai 2017)
Übungsblätter:
Blatt | Ausgabe | Abgabe | Material | Lösung | |
---|---|---|---|---|---|
1 | 21. April 2017 | 28. April 2017 | blatt01.pdf | Nim.tar.gz | automat.csp fehlfunktion.csp Nim-loesung.tar.gz |
2 | 28. April 2017 | 5. Mai 2017 | blatt02.pdf | handshake.csp udp.csp nim.tar.gz | |
3 | 5. Mai 2017 | 12. Mai 2017 | blatt03.pdf | mapped_file.hpp | engine.hpp pgrep.cpp |
4 | 12. Mai 2017 | 19. Mai 2017 | blatt04.pdf | condition.hpp | condition.cpp |
5 | 19. Mai 2017 | 2. Juni 2017 | blatt05.pdf | gdk-pixbuf-demo.cpp gen-mp.pl | barrier.hpp, jacobi-thread.hpp, jacobi.hpp, matrix.hpp und testit.cpp |
6 | 2. Juni 2017 | 9. Juni 2017 | blatt06.pdf | chash.hpp | |
7 | 9. Juni 2017 | 23. Juni 2017 | blatt07.pdf | Makefile, jacobi.hpp und testit.cpp | |
8 | 23. Juni 2017 | 30. Juni 2017 | blatt08.pdf | Makefile, integer.hpp, mpi-primes.cpp, primes.hpp, primes.cpp | |
9 | 30. Juni 2017 | 7. Juli 2017 | blatt09.pdf | ||
10 | 7. Juli 2017 | 14. Juli 2017 | blatt10.pdf | vorlage.tar.gz | tracer.tar.gz |
11 | 14. Juli 2017 | 20. Juli 2017 | blatt11.pdf | vorlage.tar.gz | cuda-jacobi-1.tar.gz (Beispiel-Lösung entsprechend der Übungsaufgabe), cuda-jacobi-2.tar.gz (schnellere Variante mit einem dynamisch wachsenden Gitter) |
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 13. Oktober 2013)
- Spezifikation zu OpenMP 4.0
- Spezifikation zu MPI 3.1
- CUDA C Programming Guide, CUDA C Best Practices Guide, Übersicht zu den weiteren Materialien zu CUDA
Kontakt
Dr. Andreas F. Borchert
Helmholtzstr. 20
Raum 1.23