Debugger und Profiler
Übersicht
Debugger finden Fehler in Programmen. In parallelen Programmen werden auch potentielle Fehler gefunden, welche irgendwann auftreten könnten. Profiler dagegen können Performanceprobleme in Programmen identifizieren. Die UNI Kassel bietet im Linux-Cluster, unterstützt vom HKHLR, den Debugger TotalView und den Profiler Vampir ein.
Debugger
Im Quellcode eines parallelisierten Programms ist die Fehlersuche noch aufwändiger als bei einem sequentiellen Programm. Ein Absturz, eine Endlosschleife oder ein falsches Ergebnis kann nun nicht nur in verschiedenen parallel laufenden Threads, sondern auch auf mehreren Computern (im Cluster als "Nodes" bezeichnet) auftreten.
Die UNI-Kassel setzt, unterstützt vom HKHLR, den Debugger TotalView ein. Eine Einführung in TotalView wird regelmäßig als Workshop angeboten. TotalView bietet u.a. folgende Möglichkeiten:
- Der Programmcode kann Zeile für Zeile ausgezuführt werden, wie bei einem sequentiellen Debugger, jedoch mit dem Unterschied, dass der Quelltext für alle Threads auf allen Nodes einzeln vorliegt. D.h. man kann beim Debuggen alle Werte von allen Variablen von allen Threads beobachten und den Thread lokalisieren, welcher für einen Fehler verantwortlich ist.
- Mit einer zusätzlichen Compileroption kann einem C, C++ und Fortran-Programm mit zusätzlichen Debuginfos compiliert werden. Stürzt das Programm nun ab, wird eine sogenannte Coredump-Datei erstellt, welche mit TotalView untersucht werden kann. Diese enthält den exakten Zustand des Programms nach dem Absturz und kann (neben vielen anderen Möglichkeiten) die Zeile im Quellcode bestimmen, in der sich das Programm befunden hat.
- TotalView kann einem laufenden Programm "zusehen" und automatisch Fehler im parallelen Code wie z.B. "Race conditions" feststellen, die dem Programmierer evtl nicht bewusst sind.
Start von TotalView im Cluster:
module load totalview/2017.1.21 |
Wichtig: Auch ein Programm, was bei kleinen Eingaben funktioniert, kann dennoch Fehler beinhalten, welche sich bei Berechnungen von mehreren Tagen auf vielen Nodes parallel irgendwann auswirken. So sollte z.B. keine Doktorarbeit auf Zahlen beruhen, welche von einem selbst geschriebenen Programm stammen, welches nie einen automatischen Debugger durchlaufen hat.
Denken Sie daran: "Ein falsches Programm hat jederzeit das Recht das zu tun, was der Programmierer von ihm erwartet". Tests können aber nur (mit Glück?) die Anwesenheit von Fehlern beweisen, aber nicht die Abwesenheit.
Profiler
Ein Profiler kann ein Programm zur Laufzeit beobachten und Performanceprobleme aufdecken. So ist es z.B. möglich zu erkennen, in welchen Methoden sich ein Programm wie lange aufgehalten hat.
Ein Beispiel: Der Profiler erkennt, dass das Programm in einer Methode "Math.pow(x,y)" eine überraschend lange Zeit verbringt. Die Methode berechnet normalerweise die Potenz "x hoch y". Bei genauerem Hinsehen wird die Methode im Programm nur benutzt, um das Quadrat von int-Variablen zu berechnen. Da die Methode intern mit double-Zahlen rechnet und verschiedene Tricks anwendet, die bei einer einfachen Quadrierung von Ganz-Zahlen nicht greifen, kann dieser Methodenaufruf einfach durch eine eigene Methode, welche simpel "x * x" zurück gibt, ersetzt werden und das Programm ist danach deutlich schneller.
Ohne den Profiler ist es kaum möglich, solche Schwächen des eigenen Programms zu finden und auf diese Weise zu optimieren. Mit einem Profiler stehen die Chancen recht gut.
Im Linux-Cluster wird der Profiler "Vampir" eingesetzt, welcher wie TotalView ebenfalls vom HKHLR eingeführt wurde. Eine Einführung in Vampir wird regelmäßig als Workshop angeboten.