Ein gutes Programm so richtig verhunzen

Wer kennt das nicht: Man hat mal ein kleines, nettes Programm geschrieben und wie es der Zufall will, möchte ein anderer, dass es "besser" werden soll. Für die Veranstaltung "Parallel Computing" ist mir sowas in etwa passiert. Man muss zum Ende des Semesters ein Projekt machen. Es gab ein paar Beispielprojekte, von denen ich mir eines ausgesucht habe: Mandelbrot.

Video zur Basisversion in 3D ohne irgendwelche Vorgaben bzgl. paralleler Verarbeitung

Im 2. Semester habe ich mich intensiv mit der Darstellung der Mandelbrot-Menge auseinadergesetzt. Man kann Stunden damit zubringen, wie man am besten die Abbrüche bei den Iterationen als Farbe darstellt - hat mich sehr gut von den eigentlichen Übungsaufgaben in "Objektorientierte Anwendungsentwicklung" abgelenkt. Jedenfalls geht es in dem Projekt darum, auf ein paar Rechnern, die mit einem Infiniband-Netzwerk verbunden sind, zig Kerne mit den Iterationen zu beschäftigen. Im Fokus stehen 4 Konzepte, diese Berechnungen auf die vorhandenen Kerne zu verteilen. Diese 4 Konzepte stellten leider nicht das primäre Problem dar:

  • Zur Darstellung sollte MPE genommen werden. Früh erkannte ich, dass MPE (nur c) keine gute Wahl ist: Es ist sehr langsam, weil jeder Kern einen einzelnen Pixel durchs Netzwerk senden will.
  • Alternativ wollte ich openGL nehmen, und die Iterationstiefe in der 3. Dimension darstellen. Ein nettes Testprogramm lief sehr flott auf einem Kern. Da aber zur Nutzung des Infiniband-Netzwerks MPI genutzt werden muss, kam es schnell zu Problemen: Der Start des Programms muss mit mpirun erfolgen und das setzt voraus, dass openGL auch auf den anderen Rechnern installiert ist, obwohl die keine openGL Teile nutzen.
  • Der nächste Versuch war dann mit FLTK. Hier hatte ich das selbe Problem wie bei openGL, allerdings habe ich die sehr kleinen Bibliotheks-Dateien beigefügt und mit ENVIROMENT-Variablen wollte ich diese beim Starten angeben. Das hat sich leider in Kombination mit mpirun als unmöglich herausgestellt. Statisches Linken wie in meiner Bachelorarbeit habe ich aus Frust erst gar nicht versucht. Einen Trick habe ich dann genutzt: man kann beim Linken einer ausführbaren Datei den kompletten Pfad zu einer Bibliothek beifügen.
  • Da eine Verteilungsart das Farmer-Worker Modell ist, was ich auch in meiner Bachelorarbeit nutzte, habe ich das Konzept 1:1 übernommen: Leider ohne Erfolg. Ich hatte mehrere blockierende MPI Sende- und Empfangsaufrufe in eigene Threads ausgelagert, damit die eigentliche Ausführung nicht blockiert wird: tut nicht! Mir flog alles um die Ohren! Der Grund dafür liegt in Infiniband, welches mehrere Threads mit MPI-Befehlen nicht zulässt. Daher ist MPI so kompiliert worden, dass es keine Multithreads-Unterstützung hat. Kompiliert man es damit, setzt es dem Infiniband ein eigenes "Protokoll" oder sowas auf. Der Versuch, eine so kompilierte Version auf dem Grid ans laufen zu bringen scheiterte natürlich.
  • Es sollte GMP benutzt werden, mit dem Zahlen in einer höheren Genauigkeit als nur DOUBLE berechnet werden können. Um GMP-Zahlen via MPI zu senden, muss man sich etwas einfallen lassen. Es gibt für Zahlen eine Funktion, um diese in ein char-Array um zu wandeln. Allerdings wird der Exponent, also da, wo das Komma in der Zahl steht, in einer eigene Variable abgelegt. Besonders bescheuert ist es, alles auf dieses Verfahren hin um zu stellen und dann hinterher fest zu stellen, dass es keine Funktion gibt, mit der aus dem char-Array UND dem Exponenten wieder eine GMP-Zahl wird! Am Ende habe ich mit einem File-Stream in einen Speicherbereich eine Art Print-Ausgabe von GMP genutzt, um die GMP-Zahl in ein Char-Array um zu wandeln. Für das Einlesen eines solchen Char-Array gibt es eine GMP-Funktion.
  • Nach vielen, vielen Stunden hatte ich dann eine Version ohne Threads, die funktionierte. Dann auf dem Grid mit FLTK und 128 Kernen ausprobiert: Peng! So wie es aussieht, verwendet FLTK auch hier und da Threads und mpirun scheint auch damit noch Probleme zu haben.

Beim letzten Punkt habe ich dann einen Trick verwendet, der extrem übel klingt: FLTK habe ich aus der ganzen MPI und mpirun Sache rausgenommen. Ich habe einen kleinen BMP-Bild-Viewer mit FLTK gemacht, der über den Linux Messagebus dem ganzen MPI-Krampf Befehle zur Berechnung gibt. Ist alles berechnet und in eine BMP-Datei geschrieben, bekommt der Viewer via Messagebus grünes Licht zum Einlesen der Datei. TOTAL KRANK, aber eine recht gute Trennung von Berechnung und Darstellung.

Die Sache mit MPI und die Arten, wie die Befehle genutzt werden müssen gefällt mir gar nicht. Immerhin konnte ich MPE umgehen, was ich auf meinem eigenen Rechner nicht ans laufen bekommen hab. Bei der Umsetzung der untersch. Verteilungsarten habe ich sogar ein GOTO nutzen müssen 🙁

Die letzte Form der Verteilung (Round Robin) wird von mir derzeit noch implementiert. Diese Implementierung ist richtig schwer, da im Grunde ein Zeitfenster existieren muss, wo während einer Berechnung ein anderer "Kern" eine Anfrage stellen kann, ob er nicht noch ein paar Jobs zur Berechnung bekommen kann. Aktuell schaut es so aus, dass alles in einem DEADLOCK endet 🙁

Viele Stunden Arbeit um Vorgaben zu erfüllen: popeliges Bild und Deadlock. Na toll.

Wer den ganzen Mist der Entwicklung inklusive Code, Commit-Kommentare (sehr viele Flüche!) verfolgen will, kann dies auf meinem GOGS-Server tun. Jeder git-Branch stellt einen eigenen Zweig des Scheiterns dar ;-D

https://dummer.click:8080/unknown/Mandelbrote

Die bisher 22 erstellten Releases sind in der Regel jeweils lauffähig. Was das Sicherheitszertifikat von der Seite angeht: Ich bin nicht bereit für eine Pseudo-Vertrauenswürdige Authentifizierungsstelle Geld zu berappen, nur damit angeblich eine "Sichere Verbindung" zur Webseite aufgebaut wird. Jedes Plugin des Webbrowsers was auf Javascript oder dergleichen basiert, inklusive der Rechtschreibprüfung, kann die Seite doch lesen, oder? Aber das ist ein ganz anderes Thema ...

 

Dieser Beitrag ist Teil einer Artikelserie:

  1. Schon wieder: Mandelbrot mit FLTK (19. Februar 2016)
  2. 3D Mandelbulb ist nur überfahrenes Pokemon (12. Februar 2016)
  3. Mandelbrotmenge in 3D (4. Februar 2016)
  4. Ein gutes Programm so richtig verhunzen (4. Februar 2016)

Schreibe einen Kommentar