Laufzeitparallelisierung von OpenMP/Java-Programmen für die Ausführung auf GPUs

Student:Georg Dotzler
Title:Laufzeitparallelisierung von OpenMP/Java-Programmen für die Ausführung auf GPUs
Type:diploma thesis
Advisors:Veldema, R.; Klemm, M.; Philippsen, M.
State:submitted on September 1, 2009
Prerequisits:

Für Shared-Memory-Systeme existieren zahlreiche Übersetzer, die es dem Programmierer erlauben, ein sequentielles Programm mittels Übersetzer-Direktiven zu parallelisieren. Der Übersetzer unternimmt hierbei die nötigen Schritte, um einen als parallel ausführbar markierten Programmteil ohne weiteres Zutun des Programmierers auf mehrere parallel ablaufende Aktivitätsträger aufzuteilen. Ein Beispiel hierfür ist der OpenMP-Standard [1].

In einer Studienarbeit [2] wurde die Spezifikation von OpenMP für Java [3,4] im Java-Übersetzer des Eclipse-Projektes implementiert. Der bisherige Ansatz verwendet Code-Schablonen, die parallele Regionen des Java-Programms zur Übersetzungszeit auf Java-Threads abbilden. Aus einem ehemals rein sequentiellen Programm wird somit ein rein paralleles Programm erzeugt.

Topic:

Der bisherige Ansatz der statischen Parallelisierung von OpenMP/Java-Programmen im Eclipse-Übersetzer soll dahingehend modifiziert werden, dass die Parallelisierung des Programms nicht mehr statisch zur Übersetzungszeit stattfindet, sondern während der Programmausführung dynamisch durchgeführt wird. Weiterhin soll die Parallelisierung nicht auf Java-Threads aufbauen, sondern OpenCL-Programme für moderne Graphikkarten mit GPU erzeugen.

Zur Erkennung paralleler Regionen soll der OpenMP/Java-Übersetzer Meta-Informationen zum Byte-Code des Programms hinzufügen, die beschreiben, welche OpenMP-Konstrukte zur Parallelisierung verwendet wurden. Diese Meta-Informationen werden zur Laufzeit von einem zu entwickelnden Class-Loader ausgelesen, das Programm auf Eignung für die parallele Ausführung auf einer GPU analysiert und eine Laufzeitparallelisierung des Programms durchgeführt. Für die Analyse des Byte-Codes kann auf ein existierendes Framework (z.B. BCEL [5]) zurückgegriffen werden.

Für die Erzeugung von GPU-Code kann auf vorgefertigte Schnittstellen zurückgegriffen werden (z.B. CUDA [6], Brook+ oder OpenCL [7]). Die Schnittstelle zur Bibliothek sollte vom verwendeten Programmierframework für die GPU abstrahieren und unterschiedliche GPU-Programmierframeworks zulassen.

Da GPUs im Allgemeinen nicht beliebig komplexen Code ausführen können, muss das OpenMP/Java-Programm auf Parallelisierbarkeit analysiert werden. Ist ein Programm nicht für die Ausführung auf GPUs geeignet, so muss auf eine Parallelisierung verzichtet werden. In diesem Fall wird der sequentielle Byte-Code an die JVM zur Ausführung Übergeben. Für paralleliserbare Programme soll durch geeignete Heuristiken entschieden werden, ob eine Parallelisierung und Ausführung auf der GPU lohnenswert ist.

Die Leistungsfähigkeit der Implementierung ist durch Experimente mit bekannten Benchmarks zu evaluieren. Hierbei ist darauf zu achten, dass die Implementierung ohne unnötigen Ballast auskommt, d.h. der Bearbeiter soll das System im Rahmen der Evaluation optimieren, sodass eine maximale Leistungsfähigkeit erreicht wird.

Im Rahmen der Ausarbeitung sollen die Änderungen an der existierenden Implementierung des Übersetzers und des Laufzeitsystems detailliert beschrieben werden. Der Entwurfsraum möglicher Lösungen und Implementierung ist detailliert zu analysieren; Designentscheidungen sind zu begründen. Weiterhin soll die Ausarbeitung die Leistungsfähigkeit diskutieren und diese anhand der verwendeten Benchmarks belegen.

Meilensteine

  • Einarbeitung in den existierenden Eclipse-Übersetzer für OpenMP/Java
  • Änderung der Code-Erzeugung, Hinzufügen der Meta-Informationen zum Byte-Code, Einarbeitung in das GPU-Programmiermodell
  • Design der Schnittstelle der Java-Laufzeitumgebung und der Code-Erzeugungsbibliothek
  • Implementierung des Class-Loaders und der Code-Erzeugungsbibliothek
  • Messungen zur Leistungsfähigkeit der Implementierung mithilfe einer Benchmarksuite (z.B. OpenMP/Java-Version der Java Grande Benchmarks)
  • Optimierung des Übersetzers bzw. des Laufzeitsystems zur Steigerung der Leistungsfähigkeit der Implementierung.
  • Ausarbeitung.

Literatur
[1] OpenMP Application Program Interface, Version 2.5, May 2005.
[2] Dotzler, Georg: Implementierung des JaMP-Programmiermodells für eine Java-VM. Studienarbeit, Lehrstuhl für Informatik 2, Friedrich-Alexander-Universität Erlangen-Nürnberg, Oktober 2008.
[3] Klemm, Michael; Veldema, Ronald; Bezold, Matthias; Philippsen, Michael: A Proposal for OpenMP for Java. In: Proc. of the Intl. Workshop on OpenMP, Reims, France, 2006, CD-ROM.
[4] Obdrzealek, Jan: OpenMP for Java. Technical Report, EPCC-SS-2000-08, EPCC, University of Edinburgh, Edinburgh, Scotland, 2000.
[5] http://jakarta.apache.org/bcel/
[6] http://www.nvidia.com/object/cuda_get.html
[7] http://khronos.org/registry/cl/specs/opencl-1.0.29.pdf

watermark seal