Hernádi, L. A. (2019). Ein Vergleich ausgewählter Frameworks zur Programmierung von GPGPUs [Diploma Thesis, Technische Universität Wien]. reposiTUm. https://doi.org/10.34726/hss.2019.61720
E193 - Institut für Visual Computing and Human-Centered Technology
-
Date (published):
2019
-
Number of Pages:
253
-
Keywords:
GPU; GPGPU; Benchmarking; CUDA; OpenCL
de
GPU; GPGPU; Benchmarking; CUDA; OpenCL
en
Abstract:
Diese Arbeit beschäftigt sich mit den unterschiedlichen Frameworks um auf Grafikkarten (General Purpose Graphics Processing Units (GPGPUs)) Programmcode auszuführen. Auf der einen Seite können CPUs durch Anpassung der Reihenfolge von auszuführenden Befehlen kürzere Laufzeiten erreichen. Auf der anderen Seite bieten GPGPUs ein unerreichtes Maß an paralleler Ausführung von Code. Diese Arbeit gibt einen Überblick über high-level Frameworks wie OpenMP und mid-level Frameworks wie CUDA. Um die Wahl eines der zahlreichen Frameworks zu erleichtern, berücksichtigt diese Arbeit Aspekte der Lesbarkeit, Anzahl der Änderrungen von Codezeilen und nicht zuletzt auch die Leistung. Für Personen die schon eine Nvidia Grafikkarte besitzen wird CUDA empfohlen, nicht zuletzt auch wegen der Entwicklungsumgebung (IDE). Für kleinere C / C++ oder Fortran Projekte, bei denen Lesbarkeit wichtiger ist als Geschwindigkeit, wird OpenMP oder OpenACC empfohlen. Diese Frameworks bieten auch die Möglichkeit Code auf GPGPUs auszuführen. Für Java Projekte mit hoher Daten-Parallelität wird aparapi empfohlen, welches aus java Klassen OpenCL Code generieren und diesen auf der GPGPU ausführen kann. Weiters wird auf Vorteile und Nachteile der Frameworks eingegangen, und häufige Stolpersteine beschrieben, sowie Hinweise zur Auswahl eines Frameworks angeboten. Um den Code unterschiedlicher Frameworks zu veranschaulichen, werden Matrix Matrix Multiplikationen und sparse Matrix Vektor Multiplikationen gezeigt. Zusätzlich werden die Geschwindigkeiten auf unterschiedlicher Hardware verglichen.
de
Programmers are accustomed writing code to be executed on CPUs. CPUs have means to optimize single threaded performance at runtime.GPGPUs with a large number of computing units combined with fast context-switching they are well-suited for parallel computing. Since 2006 GPGPUs have emerged and allow highly parallelizable algorithms using their high number of cores and fast context-switching. The present work focuses on frameworks capable of running scientific applications on GPGPUs. It considers various frameworks, starting from pragma-based frameworks like OpenMP down to low-level languages like PTX. It gives an overview of available technologies and provides code samples as well as benchmarks. In order to support CPU programmers choosing a suitable framework for their given problem, this thesis considers aspects of readability, required changes and performance. For owners of recent Nvidia graphics cards we recommend CUDA because of the available IDE and documentation. Developers of small C / C++ or Fortran projects should consider OpenMP or OpenACC with a few directives to advise the offloading to GPGPUs. Java Developers on the other hand will stay flexible with aparapi which generates OpenCL code from special Java classes and run it on GPGPU. These frameworks have the advantage of achievable significant speed-ups compared to sequential code by telling the compiler which regions should be parallelized and what to calculate on GPGPUs. Further, the present work points out advantages and disadvantages of each framework, common framework-related pitfalls, and gives recommendations on choosing a framework. To illustrate the frameworks, kernels as dense matrix-matrix-multiplication and sparse matrix-vector-multiplication are shown. Finally, various benchmarks show effects of optimizations to performance.