Design und Implementierung eines CUDA-Backends für den Lift-Compiler
Veranstaltungsnummer 108066
Die Landschaft der hochperformanten parallelen Prozessoren befindet sich in einem rasanten Umbruch durch die Einführung von spezialisierten Recheneinheiten, die wachsende Rechenleistung auf Kosten allgemeiner Anwendungsmöglichkeiten anbieten. Diese Hardware ist meist schwierig zu programmieren und benötigt Expertenwissen zum Erreichen von maximaler Performanz. Ein Beispiel für solch spezialisierte Hardware sind NVIDIAs Tensor Cores. Mit diesen lassen sich besonders effizient Matrix-Multiplikationen berechnen. Ein großer Nachteil ist, dass nicht jede GPU (Graphics Processing Unit) Tensor Cores unterstützt und dass Programme, die Tensor Cores verwenden, nicht auf solchen GPUs ausgeführt werden können, obwohl das gleiche (eine Matrix-Multiplikation) berechnet werden soll.
Der Lift Compiler, entwickelt an der University of Edinburgh, der University of Glasgow und der WWU, ist ein aktueller Ansatz, um GPU-Programme von abstrakten High-Level-Programmen automatisch zu generieren. High-Level-Programme in Lift beschreiben einzig, was zu berechnen ist, ohne zu beschreiben, wie es berechnet werden soll. Diese High-Level-Programme werden systematisch mithilfe sogenannter Rewrite Rules in Low-Level-Programme in Lifts Intermediate Language (IL) transformiert. Die IL basiert auf Primitiven, die hardwarenahe Konzepte zur Programmierung von GPUs modellieren. So lässt sich zum Beispiel die Verwendung von spezifischen Speicherbereichen auf der GPU, mit den ihnen gegebenen Vor- und Nachteilen, festlegen. Nichtsdestotrotz lässt sich das gleiche Programm berechnen, unabhängig davon, welcher Speicherbereich verwendet wird. Ein High-Level-Programm kann somit in viele verschiedene Low-Level-Programme transformiert werden, wobei jedes Programm stets dasselbe berechnet, jedoch unterschiedliche Optimierungen oder Hardware verwendet. Lifts Low-Level-Programme werden anschließend in Code für die Zielplattform übersetzt.
CUDA ist die State-of-the-Art-Plattform zur Entwicklung von rechenintensiven hoch-parallelen Programmen auf NVIDIA GPUs. In der Industrie und Wissenschaft ist es unter anderem relevant im Kontext von Wetter-Simulationen, Bioinformatik, Data Science und Machine Learning. CUDA ermöglicht die Verwendung von spezialisierter Hardware wie Tensor Cores, unterstützt spezifische Instruktionen zum schnellen hardwaregestützten Austausch von Daten zwischen Registern von verschiedenen Threads, bietet einen hochentwickelten Profiler zum Erkennen von Bottlenecks bezüglich der Performanz von Programmen und vieles mehr.
In diesem Projektseminar soll der Lift Compiler um ein CUDA Backend erweitert werden.
Lifts IL, die derzeit auf OpenCL-spezifischen Primitiven basiert, soll dazu um CUDA-spezifische Primitive ergänzt werden. Insbesondere für spezialisierte Hardware ist dazu eine Analyse der Anforderungen an diese Primitive zur Codegenerierung nötig. Um generierte Lift-Programme ausführen und testen zu können, soll außerdem eine C++-Bibliothek entwickelt werden, die ein Interface zwischen der CUDA-Laufzeitumgebung und dem in Scala entwickelten Lift Compiler darstellt.
Veranstalter
Ansprechpartner: Bastian Köpcke M.Sc. und Florian Fey M.Sc.