Towards dynamic threading support for OpenMP
Jacques Stadler · Repository for Publications and Research Data (ETH Zurich) · 2009
Recent developments in microprocessor design show a clear trend towards multi-core and multiprocessor architectures.This radical shift in processor design results from diminishing returns of e.g.increasing processor frequencies or deeper pipelines.To exploit the available hardware resources of modern processors, programmers must write parallel code by e.g.distributing workloads to multiple threads of execution.To simplify this task, numerous approaches have been proposed.One successful candidate is OpenMP, which is a standard that provides a high-level interface for parallel programming.While OpenMP performs well with regular workloads, unbalanced workloads can lead to inefficient resource utilization.The main reason for this inefficiency is, that the number of threads in a parallel region must remain constant throughout the parallel region's scope.As a consequence, idle resources cannot be used to assist parallel regions, even if the regions could profit from additional resources.To remedy this issue, we propose dynamic threading as an extension to the OpenMP standard which allows idle threads to join active work-sharing constructs.The proposed approach was implemented in the GNU Compiler Collection.Preliminary benchmarking shows that our approach does not introduce additional overhead, and can lead to performance improvements for several scenarios.iiiZusammenfassung Neuste Entwicklungen im Microprossesor Design zeigen klare Trends in Richtung von Multicore und Multiprozessor Architekturen.Dieser fundamentale Wechsel im Prozessor Design ergibt sich aus den abnehmenden Erträgen durch das erhöhen der Prozessortaktraten und der Vergrösserung der Pipelines.Um die verfügbaren Resourcen von modernen Prozessoren auszunutzen, müssen Programmierer nun parallelen Code schreiben, zum Beispiel indem sie die Arbeitslast auf mehrere Ausführungsstränge verteilen.Um diese Aufgabe zu vereinfachen wurden eine Vielzahl von Ansätzen vorgeschlagen.Ein erfolgreicher Kandidat stellt der OpenMP Standard dar, der eine high-level Schnittstelle zum parallelen programmieren anbietet.Während OpenMP gute Leistungen erbringt wenn es sich um ausgeglichene Arbeitslasten handelt, so kann es bei unausgeglichenen Arbeitslasten schnell zu uneffizienter Resourcenauslastung führen.Der Hauptgrund für diese Uneffizienz liegt darin, dass die Anzahl der Threads innerhalb einer parallelen Region konstant bleiben muss.Als Folge davon, können freie Resourcen, auch wenn es nützlich wäre, nicht genutzt werden um einer parallel Regionen mitzuhelfen.Um dieses Problem anzugehen schlagen wir dynamisches Threading als Erweiterung zum OpenMP Standard vor, welches freien Threads das beitreten von aktiven, arbietsteilenden Regionen erlaubt.Wir haben unseren Ansatz in der GNU Compiler Collection implementiert.Erste Benchmarks zeigen dass unser Ansatz keinen zusätzlichen Overhead einführt und bei verschiedenen Fällen zu Leistungssteigerungen führen kann.