Parallelisierung, einfach anfangen ...

Best Practice

Parallelisierungs-API

Um ein Programm zu parallelisieren reicht es nicht aus die Syntax einer Parallelisierungs-API zu kennen. Die Parallelisierungs-API ist einer von vielen wichtigen Punkten, aber nicht der Wichtigste.

Redesign

Parallelisierung muss von Anfang an im Design berücksichtigt werden. Für ein Legacy-Programm bedeutet das deshalb ein Redesign des ganzen Programms.

Bildliche Vorstellung

Es ist extrem hilfreich sich die Parallelisierung bildlich vorzustellen. Wie sieht es aus, wenn ein Array parallel abgearbeitet wird? Wie sieht eine parallele Matrix-Vektor-Multiplikation aus?

Konzentrieren

Die Aufrufe der Parallelisierungs-API sollen nicht über den ganzen Code verstreut werden, sondern sollen in wenigen Klassen und Methoden konzentriert werden. Der parallelisierte Algorithmus soll im Code immer noch klar erkennbar sein und nicht mit der Parallelisierungs-Code vollgekleckert werden.

Der Code, der für die Hauptrechenlast verantwortlich ist, soll in einer Methode isoliert sein.

Klare Eigentumsverhältnisse

Bei der Parallelisierung ist es wichtig für klare Eigentumsverhältnisse bei den Daten zu sorgen, d.h. sich Gedanken darüber zu machen welchem Prozess gehören welche Daten. Diese Aufteilung soll während der Berechnung nicht mehr geändert werden.
Eigentum der Daten bedeutet, dass nur der Eigentümer-Prozess lesend und schreibend auf die Daten zugreift und alle anderen Prozesse (die Konsumenten-Prozesse) nur lesend. Nur der Eigentümer-Prozess berechnet also die Daten.

Shared Memory

Bei der Shared Memory Parallelisierung ist der Zugriff auf die Daten anderer Prozesse syntaktisch einfach, es ist nämlich keine spezielle Syntax dafür erforderlich.

Distributed Memory

Bei der Distributed Memory Parallelisierung ist der Zugriff auf die Daten anderer Prozesse aufwändig. Die Daten müssen vom Eigentümer-Prozess an die Konsumenten-Prozesse geschickt werden. Die Konsumenten-Prozesse arbeiten also nicht mit den Originaldaten, sondern mit Kopien. Vom Senden und vom Empfangen von Daten handelt fast die gesamte MPI Bibliothek.

Eine Version

Es soll nur eine Version des Programms entwickelt werden, die parallele Version und nicht zwei Versionen (eine serielle und eine parallele Version). Die serielle Version ist einfach ein Spezialfall der parallelen Version (Anzahl der Prozesse = 1) und nicht umgekehrt.

Dokumentation

Bei einer verschachtelten Schleife muss erst noch untersucht werden, wie eine Parallelisierung realisiert werden kann. Bei mathematischen Operationen wie dem Matrix-Vektor-Produkt oder dem Tensor-Produkt ist die Parallelisierung dagegen straightforward. Deshalb ist es wichtig zu dokumentieren, was eine Schleife mathematisch tut.

Unit-Tests

Die Ergebnisse von parallelen Rechnungen müssen in Unit-Tests mit den Ergebnissen von seriellen Rechnungen verglichen werden.

Oftmals wird das Ergebnis im Rahmen der Rechengenauigkeit durch die Parallelisierung beeinflusst. Die Parallelisierung ändert z.B. die Summationsreihenfolge bei einem Integral.