Bachelor Thesis BCLR-2022-99

BibliographyHeidrich, Felix: Vergleich von Parallel STL Implementierungen für GPUs mit nativen Frameworks.
University of Stuttgart, Faculty of Computer Science, Electrical Engineering, and Information Technology, Bachelor Thesis No. 99 (2022).
71 pages, german.
Abstract

Kurzfassung

Heutzutage werden neue Rechner und vor allem auch Server (Cluster) mit Graphics Processing Units (GPUs) ausgerüstet, um Laufzeiten so gering wie möglich zu halten. Probleme, die besonders viel Leistung von einem Rechner oder Cluster beanspruchen, können meistens auf einer GPU parallelisiert werden und dadurch die Dauer der Ausführung verringert werden. Um die hohe Rechenleistung und die damit verknüpfte Laufzeitverbesserung der GPUs jedoch nutzen zu können, bedarf es einer der vielen verschiedenen Frameworks, wie Compute Unified Device Architecture (CUDA), OpenCL oder SYCL, was einen Anfänger leicht überfordern kann. Verglichen mit dem Programmieren für eine Central Processing Unit (CPU) unter C++, ist bei diesen Frameworks die Hürde für Anfänger sehr viel höher, da man hier sehr viel mehr beachten muss. Programmierer, die sich bereits gut mit der Sprache C++ auskennen, kennen meist auch die Algorithmen der Standard Library (STL). Diese Bibliothek unterstützt seit dem C++17 Standard die Parallele Ausführung von Algorithmen durch Exekutoren. Der Grafikkartenhersteller NVIDIA wollte die Parallel Standard Library (Parallel STL) auch auf seinen GPUs ausführen können und führte Mitte 2020 den nvc++ Compiler in seinem NVIDIA High Performance Computing Software Development Kit (NVHPC SDK) ein. Dieses Software Development Kit (SDK) kann Code durch den nvc++ Compiler, der die Parallel STL verwendet, für die Nutzung auf GPUs kompilieren. Des Weiteren kann nvc++ Code auch für CPUs kompilieren, wodurch dieser ebenfalls parallel auf CPUs ausgeführt werden kann. Intel folgte am Ende desselben Jahres mit dem Intel oneAPI DPC++ Compiler, der in Version 2021.1.2 des Intel C++ Compiler Classic Compiler-Pakets zum ersten Mal enthalten war. Dieser kann GPUs mittels SYCL ansprechen. Inwiefern dieser neue Ansatz, der parallelen Programmierung für Grafikkarten, besser ist als das native Framework CUDA für NVIDIA GPUs, soll in dieser Arbeit herausgefunden werden. Für den Vergleich der beiden Ansätze werden ausgewählte Algorithmen und Probleme sowohl in CUDA als auch in der Parallel STL implementiert und anschließend deren Laufzeiten analysiert. Ferner wird auch auf die Codelänge der Beispiele eingegangen, da diese sich drastisch zwischen den beiden Frameworks unterscheidet und kürzerer Quellcode meist leichter zu verstehen ist. Die Laufzeitmessungen auf zwei Verbraucher- und zwei Datencenter-GPUs haben dabei ergeben, dass die Parallel STL durchschnittlich fast 50 % schneller als CUDA ist. Die Implementierungen wurden sehr einfach gehalten und kaum optimiert, damit der Vergleich nicht beeinflusst wird. Wenn man den CUDA Code mittels Unified Shared Memory (USM) optimiert, ist CUDA 7 % schneller als die Parallel STL. Es wurden auch Beispiele gefunden, bei denen die Parallel STL Implementierung 3 bis mehr als 1 000 mal langsamer als CUDA ist. Dies tritt vor allem dann auf, wenn sich der CUDA Code leicht optimieren lässt oder der CUDA Code nicht komplett durch Funktionen der Parallel STL abbilden lässt. Der Quellcode der Parallel STL Implementierungen war im Schnitt 43,23 % kürzer als der entsprechende CUDA Code. Sämtliche Implementierungen sind unter folgendem Link im öffentlichen GitHub Repository dieser Bachelorarbeit zu finden: https://github.com/heidrifx/cuda-stdpar-samples. Dabei zeigt der Tag v0.1 den Stand, mit dem der Vergleich durchgeführt wurde.

Full text and
other links
Volltext
Department(s)University of Stuttgart, Institute of Parallel and Distributed Systems, Scientific Computing
Superviser(s)Pflüger, Prof. Dirk; Breyer, Marcel
Entry dateApril 18, 2023
   Publ. Computer Science