17.01.2014 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!