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.