Beruflich Dokumente
Kultur Dokumente
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?
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.
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.
Man kann auch alle Punkte in ein Gitter einsortieren und dann je nach Radius nur in der
Nachbarzellen suchen.
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.