Paralleles Programmieren
Table of contents
Nutzung
Zur Zeit sind keine Mechanismen zur Jobkontrolle oder Quotas in Betrieb. Vorrang hat die interaktive Arbeit, insbesondere in Lehrveranstaltungen. Bei längerlaufenden Projekten bitte vorab eine E-Mail mit kurzen Abschätzungen der zu erwartenden Laufzeit, der einbezogenen Maschinen und zum Nutzeraccount.
Plattenplatz
Größere, temporär anfallende Datenmengen sollten nicht im HOME-Verzeichnis angelegt werden. Hierfür stehen auf jeder Maschine 100 GB unter /mnt/scratch/ lokal zur Verfügung. Dort können Nutzer Daten ablegen (bitte dazu ein Verzeichnis mit dem Nutzernamen anlegen); nur der Besitzer der Daten kann diese wieder löschen. Der Bereich ist nicht zur ständigen Ablage größerer Datenmengen gedacht und unterliegt nicht dem Backup. Ältere Daten werden in regelmäßigen Zeitabständen und ohne Vorwarnung gelöscht!
Technik
Zur Verfügung stehen im Raum B113 24 PC Intel Core i5-4590 (Quad-Core; 3.3GHz; 16GB RAM; 128 GB SSD) unter Ubuntu Linux 18.04. Je nach Anforderung können Programme parallelisiert werden
- zur Nutzung der insgesamt 4 Cores auf einer Machine (OpenMP),
- zur verteilten Nutzung der Prozessoren auf unterschiedlichen Maschinen des Clusters (OpenMPI).
Als Beispiel wird jeweils ein C++-Programm verwendet, das eine Bestimmung von π aus dem Verhältnis gleichverteilter Zufallszahlen, die in einem Quadrat der Kantenlänge d=1 bzw. in einem einbeschriebenen Kreis des Durchmessers d=1 landen, durchführt.
In einer seriellen Variante (1 thread) könnte das Programm wie folgt aussehen
Das Programm erzeugt folgende Ausgabe:
pi ist etwa 3.14152536; Rechenzeit: 20.5405180454s
Paralleles Programmieren auf einem PC mit OpenMP
The OpenMP Application Program Interface (API) supports multi-platform shared-memory parallel programming in C/C++ and Fortran on all architectures, including Unix platforms and Windows NT platforms. Jointly defined by a group of major computer hardware and software vendors, OpenMP is a portable, scalable model that gives shared-memory parallel programmers a simple and flexible interface for developing parallel applications for platforms ranging from the desktop to the supercomputer. (Zitat OpenMP.org)
- Erweiterungen für C/C++ und Fortran durch Compiler-Pragmas
- Compiler, die OpenMP nicht verstehen, fassen die zusätzlichen Anweisungen als Kommentare auf.
- Code bleibt seriell kompilierbar
- Hauptanwendung: Parallelisierung von Schleifen
- gcc/g++: zusätzlicher Kompiler-Schalter -fopenmp
Ein Beispielprogramm, das nacheinander immer mehr threads verwendet,
könnte so aussehen
Das Programm produziert folgende Ausgaben:
1 threads: pi ist etwa 3.141583236; Rechenzeit: 13.3805418015s
2 threads: pi ist etwa 3.141581852; Rechenzeit: 6.71105480194s
3 threads: pi ist etwa 3.141584448; Rechenzeit: 4.60725498199s
4 threads: pi ist etwa 3.141585436; Rechenzeit: 3.53783011436s
5 threads: pi ist etwa 3.141580136; Rechenzeit: 3.64640378952s
6 threads: pi ist etwa 3.141567092; Rechenzeit: 3.66294598579s
Man erkennt sehr gut, dass over-committing (Verwendung von mehr als der vom Prozessor bereitgestellten 4 virtuellen Kerne) keine Verbesserung der Rechenzeit bringt.
Paralleles Programmieren auf mehreren PC mit OpenMPI
The Open MPI Project is an open source MPI-2 implementation that is developed and maintained by a consortium of academic, research, and industry partners. Open MPI is therefore able to combine the expertise, technologies, and resources from all across the High Performance Computing community in order to build the best MPI library available. Open MPI offers advantages for system and software vendors, application developers and computer science researchers. (Zitat open-mpi.org)
- Kein gemeinsamer Speicher (distributed memory): Kommunikation über Systemgrenzen hinweg via Netzwerk
- Dazu muss das Programm auf allen beteiligten Maschinen erreichbar sein (shared storage, z.B. HOME-Verzeichnis im NFS, passwortloser ssh-Zugang über geheime/öffentliche Schlüsselpaare).
- MPI - Message Passing Interface ist eine Schnittstellendefinition für Bibliotheken.
- MPI-Bibliotheksaufrufe sind für Fortran, C und C++ standardisiert.
- Alle MPI-Prozesse starten das gleiche Programm.
- MPI-Befehle sorgen für
- Identifikation der Prozesse mittels einer eindeutigen ID,
- Kommunikation der Prozesse untereinander,
- Synchronisation der Prozesse.
- Kompilieren:
mpic++ -Wall -lmpi++ -o mc_pi_mpi mc_pi_mpi.cc - Programmm ausführen:
mpiexec -np 12 --hostfile ./mpd.hosts ./mc_pi_mpi
- Option -np: Anzahl der auszuführenden Programmkopien
- Option --hostfile: Datei mit den Namen der Maschinen und Anzahl der (maximal) zu startenden threads, z.B.:
pclp03 slots=2 max-slots=3
pclp04 slots=2 max-slots=3
pclp05 slots=2 max-slots=3
pclp06 slots=2 max-slots=3
pclp07 slots=2 max-slots=3
pclp08 slots=2 max-slots=3
Ein Beispielprogramm könnte so aussehen
Das Programm produziert folgende Ausgaben:
Rank 0 fuehrt 83333337 Berechnungen durch.
Rank 1 fuehrt 83333333 Berechnungen durch.
Rank 11 fuehrt 83333333 Berechnungen durch.
Rank 8 fuehrt 83333333 Berechnungen durch.
Rank 3 fuehrt 83333333 Berechnungen durch.
Rank 10 fuehrt 83333333 Berechnungen durch.
Rank 9 fuehrt 83333333 Berechnungen durch.
Rank 7 fuehrt 83333333 Berechnungen durch.
Rank 2 fuehrt 83333333 Berechnungen durch.
Rank 6 fuehrt 83333333 Berechnungen durch.
Rank 4 fuehrt 83333333 Berechnungen durch.
Rank 5 fuehrt 83333333 Berechnungen durch.
Rank 9 registrierte 65445742 Treffer.
Rank 8 registrierte 65450246 Treffer.
Rank 11 registrierte 65453596 Treffer.
Rank 10 registrierte 65453655 Treffer.
Rank 2 registrierte 65450775 Treffer.
Rank 3 registrierte 65453348 Treffer.
Rank 5 registrierte 65463044 Treffer.
Rank 6 registrierte 65451382 Treffer.
Rank 7 registrierte 65447636 Treffer.
Rank 4 registrierte 65448834 Treffer.
Rank 0 registrierte 65450832 Treffer.
Rank 1 registrierte 65450830 Treffer.
Insgesamt gab es 785419920 Treffer.
12 Prozesse: pi ist etwa 3.14167968; Rechenzeit: 2.55718822101s
OpemMPI mit python
Das Modul mpi4py implementiert die Anbindung des MPI-Standards an python. Ein Beispielprogramm finden Sie hier.
Der Programmaufruf mittels
mpirun --hostfile mpd.hosts -n 16 python3 pi_mpi.py
ergibt folgendes Resultat:
Prozess 0 von 16 auf pclp03:
parallel -- Mit 1e+09 Zufallspaaren: pi ~= 3.141671152 berechnet in 2.14s