Institutsbericht 2010/2011 - Leibniz-Institut für Atmosphärenphysik ...
Institutsbericht 2010/2011 - Leibniz-Institut für Atmosphärenphysik ...
Institutsbericht 2010/2011 - Leibniz-Institut für Atmosphärenphysik ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Laufzeit in Stunden<br />
44 Adaptierung einer parallelen Programmierung im KMCM<br />
(C. Schütt, G. Behnke, Th. Linow, A. Kirsch, E. Becker)<br />
Das hier am <strong>Institut</strong> entwickelte KMCM (siehe <strong><strong>Institut</strong>sbericht</strong> 2004/2005, Kap. 40), ursprünglich<br />
Ende der 90er Jahre in FORTRAN77 (FORmula TRANslation) programmiert und stets von unseren<br />
Wissenschaftlern erweitert, ist ein Spektralmodell mit terrainverfolgender Vertikalkoordinate.<br />
Die Atmosphäre wird durch Differentialgleichungen beschrieben, die über ein Zeitschrittverfahren<br />
gelöst werden.<br />
Die Modifizierungen führten zu einer Zunahme der Komplexität, was wiederum zu einer sehr<br />
intensiven Ausnutzung der vorhandenen Rechnerkapazität führte. Abhilfe brachte hier die Anschaffung<br />
des neuen Höchstleistungsrechners (siehe Einleitung/Rechentechnik), der bis zu 132 parallel<br />
laufende Rechenprozesse möglich machte. Dies machte eine Anpassung des KMCM erforderlich.<br />
Die vorhandene Parallelisierung durch OpenMP (open Multi-Processing) konnte nur bis zu<br />
einer Verwendung von 12 Kernen effektiv eingesetzt werden (Abb. 44.1). Ein Simulationstag<br />
mit Auflösung T120 (≈ 1 ◦ x 1 ◦ ) und 190 Höhenschichten benötigte ca. 5 Stunden. OpenMP<br />
ist ein Standard speziell für Shared-Memory-Umgebungen.<br />
Eine weitere Möglichkeit zum verteilten Programmieren<br />
bietet MPI (Message Passing Interface). Da der neue<br />
Rechner eine gemischte Architektur aus Shared Memory<br />
auf den Knoten und darüber hinaus ein Verbindungsnetzwerk<br />
zwischen diesen besitzt, wurde eine hybride Programmierung<br />
gewählt. So kann die vorhandene OpenMP-<br />
Parallelisierung weiter genutzt werden. Spezielle OpenMP-<br />
Kommentare starten Teile des Programms, insbesondere<br />
Schleifen als Parallelregion, diese Programmzweige werden<br />
Threads genannt. Ursprünglich gab es innerhalb jeden Zeitschrittes<br />
mehrere Parallelregionen. Dieser unnötige Verwaltungsaufwand<br />
wurde durch die Einführung einer einzigen<br />
Parallelregion, die die Zeitschleife komplett umfasst, aufgelöst.<br />
Ein weiterer kritischer Punkt ist die Synchronisierung<br />
der gleichzeitig ausgeführten Berechnungsschritte.<br />
OpenMP realisiert dies durch CRITICAL-Regionen, hierbei<br />
10<br />
8<br />
6<br />
4<br />
2<br />
0<br />
0 24 48 72 96 120 144<br />
Anzahl der Prozessorkerne<br />
T120_Version1<br />
T120-optimiert<br />
T240<br />
T120_original<br />
Abb. 44.1: Laufzeiten des KMCM vor,<br />
während und nach Abschluss der Optimierungen<br />
wird einzeln, nicht gleichzeitig, für jeden Thread die zu berechnende Variable bereitgestellt. Im<br />
KMCM sind die Variablen in einem Zustandsvektor zusammengefasst, dieser ist in so einem Fall<br />
komplett blockiert. Da aber jeder Thread jeweils auch nur einen Teil des Zustandsvektors benötigt,<br />
kann eine vorherige Zerlegung des Zustandsvektors dieses Problem beheben. Besonderes<br />
Augenmerk ist bei der Programmierung auf die Cache-Effizienz zu legen. Ein Prozessorkern kann<br />
in einem Ladeprozess nur Blöcke von 64 Bytes laden, vor allem bei Schleifendurchläufen ist dies<br />
zu beachten. Dazu wurde die Datenstruktur in einigen Programmteilen reorganisiert. Durch die<br />
bisher beschriebenen Veränderungen am Programmcode konnte die Rechenzeit insgesamt schon<br />
um 23,9 % gesenkt werden.<br />
Maßgeblich bei den Optimierungen ist die Beibehaltung des physikalischen Kerns und somit<br />
der Erhalt der Qualität der Ergebnisse. Dies führt zu Einschränkungen, insbesondere bei der Implementierung<br />
von MPI-Operationen. Im Unterschied zu OpenMP werden mit MPI nicht nur Programmteile<br />
parallelisiert, sondern das komplette Programm wird von mehreren Prozessen gleichzeitig<br />
abgearbeitet. Jeder Prozess erhält eine Rangnummer, die Arbeit wird mittels MPI-Funktionen<br />
verteilt, indem jedem Prozess nur der für ihn relevante Teil der Datenmenge übermittelt wird. Diese<br />
Kommunikation wird hauptsächlich über Sende- und Empfangsroutinen realisiert. Um die erfolgten<br />
Berechnungen zu synchronisieren, wird ein Prozess als sogenannter Root-Prozess bestimmt,<br />
nur dieser darf dann die Ergebnisse in externe Dateien abspeichern. Dieser Prozess ist während<br />
des kompletten Programmdurchlaufs dafür zuständig, den jeweils aktuellen Status des Zustandsvektors<br />
abzuspeichern. Die Initialisierung wird in unserem Fall von allen Prozessen durchgeführt.<br />
121