Sie sind auf Seite 1von 2

Prüfungsprotokoll

Massively Parallel Computing


Sommersemester 2016

Prüfer: Prof. Lensch


Protokoll: Benjamin Resch
Note: 1.0
Atmosphäre: Herr Lensch war die ganze Prüfung über freundlich und relativ gelassen. Am besten
ist, man erzählt zu einer Frage so viel man weiß. Falls man zu einem anderen Thema oder Begriff
abschweift, sollte dies etwas sein, wozu man etwas sagen kann, da Prof. Lensch bei so etwas
gerne nachhakt oder das Thema wechselt.
Sontiges: Dies war neben Computational Photography meine zweite mündliche Prüfung bei Prof.
Lensch. Bei MPC hatte ich das Gefühl, dass in der Prüfung wesentlich weniger Detailwissen
verlangt war als bei CP. Zudem ist die Note immer etwas besser als erwartet.

Erklären Sie mal, wie ein paralleles Programm auf der GPU so abläuft.

Die GPU verarbeitet einen Kernel in Form von Blöcken, die widerum in Threads aufgeteilt sind.
Dabei wird ein Block einer SM auf der GPU zugeteilt und jeder Block wird separat verarbeitet.
(Ich wusste nicht genau, worauf er mit der Frage hinaus wollte, hätte aber vermutlich viel weiter
ausholen sollen)

Können Sie das mit der Unterteilung von Blöcken und Threads genauer erklären?

Die Blöcke sind in ein Grid eingeteilt, das ein- oder zweidimsionale Struktur hat (je nach Problem).
Die Blöcke werden auf der GPU gestaffelt ausgeführt, wobei ein Block einer SM zugeteilt wird.
Jeder Block ist Threads unterteilt die ein- bis dreidimensionale Struktur haben. Das macht man,
weil viele Probleme Blockstruktur haben. Innerhalb eines Threads kann auf die Block- und Thread-
Indizes zugreifen. Threads sind außerdem in Warps von 32 bzw. 64 Threads gruppiert, die alle
immer die gleiche Instruktion ausführen. Das heißt, falls es in einem Warp Verzweigungen gibt,
werden diese hintereinander ausgeführt.

Welche Formen von Speicher gibt es auf der GPU und wie wird er verwaltet?

Global Memory: hohe Latenz, Zugriff von überall


Constant Memory: Nur Lesezugriff, gecached
Texture Memory: Nur Lesezugriff, gecached, Unterstützung von Clamping und Filterung
Shared Memory: Speicher für jeden Block, geringe Latenz
L1- und L2-Cache

Wie funktioniert Bitonic Sort?

Basiert auf der Eigenschaft von bitonic sequences, die maximal zwei Richtungswechsel in der
Zahlenabfolge enthalfen. Beim Sortieren wird eine Sequenz zunächst in der Mitte geteilt und die
beiden Teilsequenzen rekursiv sortiert, die erste aufsteigend, die zweite absteigend. Zwei sortierte
Sequenzen (also auch 2 einzelne Elmente) werden gemerged, indem sie elementweise verglichen
und vertauscht werden, wenn der Wert in der ersten Sequenz größer (bei aufsteigend) bzw. kleiner
(bei absteigend). Der Merge erfolgt auch jedes Mal rekursiv. Das heißt, bereits verglichene
Teilsequenzen werden nochmal geteilt und gemerget.

Wie ist die Laufzeit von Bitonic Sort?

Für die Sortierrekursion werden O(n*log(n)) Schritte benötigt, da die Sequenzen in jedem
Rekursionsschritt halbiert werden. Da innerhalb eines Rekursionsschritts rekursiv gemerget wird,
ergibt sich eine Gesamtlaufzeit von O(n*log(n)^2)
Wie kann man den Speedup von einem parallen Program gegenüber einem sequentiellen
Programm abschätzen?

Mithilfe von Amdahl's Law kann man mithilfe des Anteils parallelisierbarem Code den Speedup
berechnen.

Amdahl's Law ist ja ziemlich pessimistisch. Gibt es da noch eine andere Möglichkeit?

Gustafson's Law. (Hier wusste ich leider nicht mehr genau, wie sich der Speedup berechnen lässt.
Prof. Lensch wollte jedoch bloß wissen, dass dort die Größe des Problems mit berücksichtigt wird)

N-Body problems. Wie kann man die Anzahl der Nachbarpunkte innerhalb eines bestimmten
Radius zu einem Punkt bestimmen?

Triviale Methode: Durch alle anderen Punkte iterieren, Abstand berechnen und inkrementieren,
falls kleiner als Radius.
Schnellere Methode: Bounding Volume Hierarchies, z.B. kd-Trees. Ein Knoten markiert eine
Unteilung von Bereichen. Bei der Suche nach den nächsten Nachbarn wird der Baum traversiert,
wobei bestimmte Teilbäume ausgeschlossen werden können, falls der entsprechende Bereich
bereits außerhalb des momentan kleinsten Radius liegt.

Gibt es noch eine andere Methode?

Man kann auch alle Punkte in ein Gitter einsortieren und dann je nach Radius nur in der
Nachbarzellen suchen.

Wie würde man das Sortieren nach Gitterzellen machen?

Histogramme (2D) bilden und Prefix Sum berechnen. Prefix Sum gibt dann die Bucket-Grenzen
und Größen ein, so dass Punkte einsortiert werdne können.

Können Sie noch sagen, wie man partielle Differentialgleichungen lösen kann?

Bei komplexen DGL kann man die Lösung nicht explizit berechnen, deshalb berechnet man die
Lösung iterativ mit kleinen Zeitabständen, um eine möglichst gute Näherung zu erhalten. Das
nennt man Zeitdiskretisierung. Unterteilung in 3 Varianten: Explizit, Lösung wird direkt aus der
vorherigen Lösung berechnet. Implizit: Operator hängt von der zu berechnenden Lösung ab ->
nichtlineares Gleichungssystem. Semi-Implizit; Operator hängt linear von der zu berechnenden
Lösung ab -> lineares Gleichungssystem.
Zusätzlich muss die DGL noch räumlich diskretisiert werden, also im Falle eines Bildes
beispielsweise durch ein Gitter von Pixeln.

Das könnte Ihnen auch gefallen