Übungen zu Paralleles Programmieren in Fortran und C/C++

Transcription

Übungen zu Paralleles Programmieren in Fortran und C/C++
Übungen zu Paralleles Programmieren
in Fortran und C/C++
Dr. Sara Collins
SoSe 2016
Blatt 8
Aufgabe 1: Aufwärmübung MPI
(2 Punkte)
Schreiben Sie ein kleines MPI-Programm “Hello World from Rank ...”, um sich mit der
Programmierumgebung (insbesondere Compiler, Programmstart) vertraut zu machen.
Das Programm soll die Anzahl der Prozesse, die Ranknummer des jeweiligen Prozesses und den Prozessornamen ausgeben. Benutzen Sie für letzeres MPI_Get_processor_name.
Aufgabe 2: Ping-Pong mit MPI
(4 Punkte)
Schreiben Sie ein MPI-Programm, dass einen reellen Vektor der Länge n zwischen
zwei Prozessoren hin und her sendet. Messen sie die Wallclock-Zeit des Senden und
Empfangens der Message durch denselben Prozess für verschiedene n. Diese Zeiten
sollten über mehrere solche Austäusche gemittelt werden. Führen Sie diese Messungen
durch (a) für Prozesse, welche auf ein und demselben Prozessor rennen und (b) für
Prozesse, welche auf unterschiedlichen Maschinen des CIP-Pools laufen. Plotten Sie
diese Zeiten für die zwei Fälle als Funktion von n.
Aufgabe 3: Stille Post
(5 Punkte)
Entwickeln Sie ein MPI-Programm “Stille Post”, das ausgehend von Prozessor 0 nacheinander eine Nachricht an den Prozessor mit einer jeweils um eins erhöhten Ranknummer verschickt (rank→rank+1). Der Prozessor mit der höchsten Ranknummer sendet die Nachricht wieder an Prozessor 0. Die Ausgangsnachricht von Prozessor
0 ist: “MPI ist toll!”. Alle anderen Prozessoren sollen jeweils vor dem Weitersenden ein
zufälliges Zeichen der empfangenen Nachricht durch “?” ersetzen und die Nachricht
ausdrucken. Testen Sie ihr Programm für verschiedene Anzahlen von Prozessoren.
1
Aufgabe 4: Verteilte Matrixmultiplikation
(8 Punkte)
Schreiben sie ein MPI-Programm, das zwei integer Matrizen A(n, m) und B(m, k)
miteinander multipliziert:
X
C(n, k) =
A(n, m) × B(m, k).
m
Der Einfachheit halber soll dabei jeder Rank eine eigene Kopie der Matrix A besitzen. Die Matrizen B und C werden jedoch spaltenweise auf die einzelnen Prozessoren
aufgeteilt, und jeder Prozessor soll auf diesem Teil seinen Anteil an der Matrixmultiplikation ausführen. Nach Beendigung der Multiplikation soll Prozessor 0 die Matrix
C “einsammeln” und das Ergebniss mit einer seriellen Matrixmultiplikations-Routine
überprüfen (siehe z.B. matmul() und any() in Fortran).
Testen sie Ihr Programm für verschiedene MPI-Rankanzahlen und verschiedene Matrixgrößen.
2