Krupitza, D. (2023). pSTL-Bench : evaluating the capabilities of ISO C++ parallel STL implementations on modern parallel hardware using microbenchmarking [Diploma Thesis, Technische Universität Wien]. reposiTUm. https://doi.org/10.34726/hss.2023.113280
Hochleistungscomputer bestehen heutzutage aus einer Vielzahl von Plattformen, die von Multi-Core CPUs bis zu Many-Core GPUs reichen. Folglich möchten Entwickler eine einzige Codebasis haben, die auf einer Vielzahl von Beschleunigern und Plattformen läuft und die höchstmögliche Leistung erzielt. Leistungsportabilitäts-Frameworks wie RAJA, Kokkos und SYCL ermöglichen dies den Entwicklern, allerdings mit dem Nachteil abbhängig von einem nicht standardisierten Framework zu sein. Die parallele STL von ISO C++ ermöglicht es Entwicklern, standardisierten C++ Code zu schreiben und während der Kompilierung zu entscheiden, welcher Beschleuniger verwendet werden soll. Diese Eigenschaft macht ISO C++ parallel STL zu einer potentielle Alternative zu Leistungsportabilitäts-Frameworks. Derzeit gibt es einige Implementierungen für die ISO C++ Parallel STL (auch als Backends bekannt). In dieser Arbeit haben wir die Fähigkeiten von drei ISO C++ parallelen STL-Backends untersucht, nämlich GCC mit oneTBB, NVC mit OpenMP und NVC mit CUDA. Um ihre Fähigkeiten zu bewerten, haben wir eine Mikrobenchmark-Suite namens pSTL-Bench entwickelt. Sie ermöglicht das Benchmarking von parallelen STL-Primitiven und bietet wertvolle Einblicke in die Leistungs- und Skalierungseigenschaften der Backends. Mit Hilfe dieser Benchmarks konnten wir erhebliche Unterschiede in Bezug auf Leistung und Skalierbarkeit zwischen den Backends feststellen, die vielleicht nicht auf den ersten Blick erkennbar sind. Als Nebenprodukt des umfangreichen Benchmarkings können wir die Leistungsportabilität zwischen diesen Backends quantifizieren. Während bestimmte parallele Primitive eine hohe Leistungsportabilität aufweisen, gibt es andere, bei denen ein einfacher Wechsel des Backends zu einer erheblichen Leistungssteigerung führt, was zu einer niedrigen Portabilitätsbewertung führt. Um zu zeigen, dass die ISO C++ Parallel STL tatsächlich verschiedene Beschleuniger unterstützt, haben wir die Mikrobenchmark-Suite auf einen Nvidia Tesla T4-Grafikprozessor ausgelagert und dabei das NVC mit CUDA-Backend (auch bekannt als stdpar) verwendet. Obwohl viele der Benchmarks ohne zusätzliche Änderungen auf dem Grafikprozessor ausgeführt werden können, gab es bei anderen Benchmarks eine Reihe von Herausforderungen. Diese Herausforderungen spiegeln sich in unserem abschließenden Urteil über die Fähigkeiten der ISO C++ parallel STL wider. Obwohl die ISO C++ parallel STL einen guten Ausgangspunkt für das Schreiben von leistungsfähigem ISO C++ Code bietet, gibt es noch viele Probleme, die in zukünftigen Versionen behoben werden müssen.Die parallele STL von ISO C++ ist eine einfache Schnittstelle zum Schreiben von portierbarem Hochleistungscode, aber es ist noch ein weiter Weg bis zu echter Leistungsportabilität.
de
High-performance computers nowadays consist of a wide variety of architectures, ranging from multi-core CPUs to many-core GPUs. As a result, developers want to have a single code base that runs on a wide variety of accelerators and platforms and achieves the highest possible performance. Performance portability frameworks such as RAJA, Kokkos, and SYCL allow developers to do this, but at the cost of having a non-standardized third-party dependency. ISO C++ parallel STL allows developers to write standardized C++ code and decide at compile time what accelerator to target, posing as a potential alternative to those frameworks. At the moment there are several implementations (also known as Backends) for ISO C++ parallel STL. In this thesis, we evaluated the capabilities of three ISO C++ parallel STL backends, namely GCC with oneTBB, NVC with OpenMP and NVC with CUDA. To assess their capabilities, we developed a microbenchmark suite called pSTL-Bench. It allows benchmarking of parallel STL primitives and provides valuable insights into the performance and scaling characteristics of the backends. Through these benchmarks, we discovered significant differences in terms of performance and scalability among the backends, which might not be immediately apparent. As a side product of the extensive benchmarking, we can quantify performance portability between those backends. While certain parallel primitives exhibit high performance portability, there are others where simply switching the backend yields a considerable performance boost, resulting in a low-performance portability score. To demonstrate that ISO C++ parallel STL indeed supports different accelerators, we offloaded the microbenchmark suite to an Nvidia Tesla T4 GPU using the NVC with CUDA backend (also known as stdpar). Although many of the benchmarks run without any additional changes on the GPU, there were a substantial amount of challenges for other benchmarks. These challenges are reflected in our final verdict about the capabilities of ISO C++ parallel STL. Although ISO C++ parallel STL does provide a good starting point for writing performance portable ISO C++ code, there are still many hiccups and problems that need to be addressed in future releases. ISO C++ parallel STL is a simple interface for writing high-performance portable code, but it still has a long way to go to enable true performance portability.