SplashTool_GPU Optimierungen

CuPy Logo (Quelle)

Modellanpassungen

Seit ca. einem Monat arbeite ich an SplashTool_GPU. Aufgrund des modularen Setups der Konfigurationsdatei, des Managers und des Models, kann ein Großteil des Codes unverändert bleiben, dennoch mussten im Model noch zahlreiche Änderungen vorgenommen werden. Insbesondere werden maskierte arrays von CuPy nicht unterstützt, sodass der Iterationsalgorithmus so umgeschrieben werden musste, sodass die Software auch ohne Nutzung der maskierten Arrays auskommt und hierbei dieselben Funktionalitäten behält.

CuPy arrays

Ein weiterer Punkt war die Speicherung der einzelnen Daten im RAM bzw. GRAM. Ich habe mich dazu entschlossen, lediglich die Kacheln als CuPy arrays umzusetzen, die ungekachelten Daten werden daher weiterhin im RAM gehalten. Ein Auslesen aus dem GRAM erfolgt nur bei einem „iteration checkpoint“, also in der Standardeinstellung alle 1000 Iterationsschritte. Durch diese Herangehensweise kommt es somit kaum zu einer Geschwindigkeitseinschränkung, der benötigte GRAM wird jedoch massiv reduziert, was die Berechnung größerer Gebiete ermöglicht.

Cuda Kernels

Der Geschwindigkeitszuwachs ist bereits signifikant, eine weitere Optimierung ist durch die Definition von benutzerdefinierten Cuda Kerneln möglich. Durch Neuprogrammierung eines Teils der Iteration konnte somit ein weiterer Geschwindigkeitszuwachs um den Faktor 2 erreicht werden.

Vergleiche und Geschwindigkeitstests

SplashTool_GPU wurde für mehrere Gebiete und Optionen getestet und sowohl die Iterationsgeschwindigkeit als auch die Ergebnisse mit der CPU-Variante verglichen. Die Iterationsgeschwindigkeit war beim gewählten System um ca. den Faktor 10 höher, wobei identische Ergebnisse erzeugt wurden. Somit hat der Iterationskern für SplashTool_GPU mittlerweile einen guten Stand erreicht.