Implementierung des PALM-Modellsystems auf GPUs mithilfe von OpenACC

Wissenschaftlicher Bereich

Simulation turbulenter atmosphärischer und ozeanischer Strömungen

Kurzbeschreibung

PALM [1] ist ein Large-Eddy-Simulation-Modell (LES) für meteorologische Systeme. Es simuliert turbulente atmosphärische und ozeanische Strömungen durch die Lösung der Navier-Stokes-Gleichungen auf einem diskreten dreidimensionalen (3D) Gitter. Um auf massiv-parallelen Computern ausgeführt werden zu können, nutzt das Modell die Message Passing Interface (MPI) und eine zweidimensionale (2D) horizontale Domänenzerlegung. Zusätzlich enthält der Code OpenMP-Direktiven zur Nutzung der Shared-Memory-Parallelität auf aktuellen Multi-Core-CPUs. Das Modell ist für moderne Computerarchitekturen mit mehreren Cache-Ebenen optimiert und wurde auf mehr als 32.000 Kernen getestet [1].

In der Vergangenheit hatten die Entwickler PALM bereits auf GPUs portiert, zuletzt im Jahr 2016 [2]. Die Änderungen wurden jedoch aufgrund erheblicher Änderungen an Kernroutinen nie in den Produktionscode integriert. Daher konzentrierten wir uns bei dieser Zusammenarbeit darauf, den Code mit nur minimalen Änderungen zu portieren. Um dieses Ziel zu erreichen, nutzten wir neuere Funktionen von OpenACC 2.5 wie beispielsweise unstrukturierte Datenbewegungen.

Für die Entwicklung entwarfen wir einen Testfall, der eine konvektive Atmosphäre über einem erwärmten Boden simuliert. Im Portierungsprozess fügten wir den Unterprogrammen nacheinander Direktiven hinzu und überprüften deren Korrektheit anhand des Testfalls. Anschließend stellten wir sicher, dass die Daten auf der GPU verbleiben, um Übertragungen so weit wie möglich zu vermeiden. Dies beinhaltete das Hochverschieben im Aufrufstapel, die Erweiterung des Geltungsbereichs der Datenregionen und die Sicherstellung, dass Daten weiterhin korrekt über MPI ausgetauscht werden.

Darüber hinaus haben wir die Leistung ausgewählter Unterprogramme optimiert, da wir bei der Verarbeitung größerer Datensätze Engpässe festgestellt haben. Dazu gehörte der Einsatz von cuFFT [3] sowie die Portierung anderer für die FFT erforderlicher Teile der Simulation, wie beispielsweise Transponieroperationen. Zudem implementierten wir einen benutzerdefinierten Codepfad, um das maximale Element und dessen Position in einem dreidimensionalen Array zu ermitteln. Auch wenn dies dem ursprünglichen Ziel widerspricht, wesentliche Änderungen zu vermeiden, erachteten wir dies aus Leistungssicht als sehr lohnenswert.

Schließlich wurde im Dezember 2018 eine erste Version des Codes in den Hauptzweig integriert. Um Regressionen zu vermeiden, wird nun jeder neue Commit automatisch über die CI-Pipeline des Teams [4] auf GPUs getestet. Wird ein Problem festgestellt, benachrichtigt das System die Entwickler per E-Mail, die das Problem untersuchen und den fehlerhaften Commit beheben können.

Ergebnisse

Bei den folgenden Leistungsergebnissen vergleichen wir die Gesamtlaufzeiten mit einer Ausführung auf CPUs unter Verwendung einer für moderne Cache-Architekturen optimierten MPI-Version. Wir erstellen die Binärdatei mit dem Intel-Compiler in Version 19.0.1.144 und Intel MPI 2018.4.274 und binden jeden MPI-Prozess an einen einzelnen Kern. Die OpenACC-Version wird mit Version 19.7 des PGI-Compilers und OpenMPI 3.1.3 kompiliert. Zusätzlich betrachten wir eine Version mit Unterstützung für CUDA-fähiges MPI, das Daten direkt zwischen zwei GPUs überträgt, die sich möglicherweise auf unterschiedlichen Knoten befinden. Dies kommt der Leistung der MPI_Alltoall-Kommunikation zugute, die für FFT-Operationen im Drucklöser verwendet wird.

Die primären Ziel-GPUs waren Nvidia Tesla P100, wie sie im CLAIX-System des IT-Zentrums verfügbar sind. Das erste Diagramm vergleicht die Gesamtlaufzeit für einen repräsentativen Datensatz auf 1, 2 und 4 Knoten von CLAIX-2016. Jeder Knoten verfügt über 2 GPUs und 2 × 12 CPU-Kerne (Intel Xeon E5-2650v4, Broadwell), die für die Ausführung mit MPI genutzt werden.

Es ist zu erkennen, dass die OpenACC-Version mit CUDA-fähigem MPI in diesem Szenario die CPU-Konfiguration leicht übertrifft.

Das neuere CLAIX-2018-System verfügt über GPUs mit der Nachfolgearchitektur Nvidia Volta (Nvidia Tesla V100). Um einen fairen Vergleich zu ermöglichen, führen wir die MPI-Konfiguration auch auf 2 × 24 CPU-Kernen (Intel Xeon Platinum 8160, Skylake) aus, wie sie in diesem System vorhanden sind. Die Grafik zeigt, dass sich die GPU-Laufzeit desselben Codes im Vergleich zu CLAIX-2016 um etwa 20 % verbessert. Die CPUs sind jedoch um etwa 30 % schneller, da sich ihre Laufzeit aufgrund der erhöhten Anzahl an Kernen um bis zu den Faktor 2 verkürzt.

Zusammenfassend lässt sich sagen, dass die portierte Anwendung auf CPUs und GPUs eine vergleichbare Leistung zeigt. Dadurch kann der Code auf einer größeren Bandbreite an Architekturen und Systemen ausgeführt werden. Insbesondere kann PALM die Vorteile aktueller heterogener Cluster nutzen, die mit GPUs ausgestattet sind. Durch die Integration in den Hauptzweig ist die Portierung nachhaltig und steht anderen Nutzern des Codes zur Verfügung. Darüber hinaus werden bei jedem Commit automatisierte Tests ausgeführt, die Probleme frühzeitig erkennen.

Säulendiagramm mit der Laufzeit von CLAIX-2016
Säulendiagramm mit der Laufzeit von CLAIX-2018

Code-Details

Anzahl der Codezeilen: > 200.000
Programmiersprachen und Modelle: Fortran 95/2003, MPI, OpenMP, OpenACC (im Rahmen dieser Zusammenarbeit hinzugefügt)

Entwicklung und Zusammenarbeit

Jonas Hahnfeld, IT-Zentrum / Lehrstuhl für Hochleistungsrechnen, RWTH Aachen
Helge Knoop, PALM-Arbeitsgruppe, Institut für Meteorologie und Klimatologie, Leibniz-Universität Hannover
Siegfried Raasch, PALM-Arbeitsgruppe, Institut für Meteorologie und Klimatologie, Leibniz-Universität Hannover
Sandra Wienke, IT-Zentrum / Lehrstuhl für Hochleistungsrechnen, RWTH Aachen

Quellen

[1] Das PALM-Modellsystem. Abgerufen am 9. September 2019 von https://palm.muk.uni-hannover.de/

[2] Helge Knoop, Tobias Gronemeier, Christoph Knigge, Peter Steinbach. 2016. Portierung des MPI-parallelisierten LES-Modells PALM auf Multi-GPU-Systeme – Ein Erfahrungsbericht. In: Internationale Konferenz über Hochleistungsrechnen (S. 508–523). Springer, Cham.

[3] cuFFT :: CUDA-Toolkit-Dokumentation. Abgerufen am 21. Oktober 2019 von https://docs.nvidia.com/cuda/cufft/index.html

[4] Helge Knoop, Jonas Hahnfeld, Tobias Gronemeier, Siegfried Raasch. 2019. PALM trifft auf OpenACC: Leistungsportabilität eines praxisnahen CFD-Codes. Einsatz von OpenACC für Strömungsdynamik und atmosphärische Vorhersagestudien: Erfahrungsberichte von Anwendungsentwicklern. PASC19.