Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

JOMP wittmann@in.tum.de.

Ähnliche Präsentationen


Präsentation zum Thema: "JOMP wittmann@in.tum.de."—  Präsentation transkript:

1 JOMP

2 JOMP – OpenMP for Java Überblick: JOMP und OpenMP JOMP Warum und Wofür
Preprocessor Syntax und Anweisungen Library Methoden Unterschiede zum C/C++-Standard Performance Beispiel Fazit und Ausblick

3 JOMP – OpenMP for Java JOMP ist eine Implementierung des
C/C++ und FORTRAN-OpenMP-Standards OpenMP besteht aus: Sammlung von Anweisungen, Library Routinen und Umgebungsvariablen Betonung liegt auf Performance und Skalierbarkeit arbeitet mit fine- oder coarse-grain Parallelismus spezifiziert keine Konzepte wie Data Distribution Control, etc.

4 JOMP – Warum und Wofür? JOMP
entstand an der University of Edinburgh in Schottland, UK verbindet die Vorteile von Java (Portabilität, Ease-Of-Use, autom. Garbage Collection) mit der parallelen Programmierung ist keine wirkliche Erweiterung der Sprache Vorteile eines anweisungsbasierten Systems im Vergleich zu nativen Threads: einfacher zu „warten“ Effizienz (1 Thread/Prozessor, Barrier)

5 JOMP – ein Preprocessor
Ist komplett in Java geschrieben worden Anweisungen werden in Source Code eingebaut und vom Preprocessor in native Threads umgewandelt Syntax: Orientiert sich an OpenMP: Form einer Anweisung: //omp <directive> <clauses>

6 JOMP – Anweisungen parallel //omp parallel <statement> Beispiel:
//omp parallel shared(a,n) private(myid,i) //omp reduction (+:b) { myid = OMP.getThreadNum(); for( i=0; i<n; i++){ b += a[myid][i] }

7 JOMP – Anweisungen for und ordered
//omp for [nowait] [reduction(<operator>:<vars>)] //omp [schedule(<mode>, [chunk-size])] [ordered] Beispiel: //omp parallel shared(a,b) { //omp for for (i=1; i<n; i++){ b[i] = (a[i] + a[i-1]) * 0.5; }

8 JOMP – Anweisungen single //omp single [nowait] master //omp master
barrier //omp barrier only //omp only <statement>

9 JOMP – Library Methoden
getNumThreads() – Anzahl der Threads in paralleler Region setNumThreads(n) – Anzahl der Threads in paralleler Region festlegen getMaxThreads() – Anzahl Threads in zukünftiger paralleler Region getThreadNum() – Zahl des laufenden Threads getNumProcs() – maximale Anzahl von Prozessoren für ein Programm inParallel() – true wenn parallel ausgeführt wird setDynamic() – dynamische Anpassung Anzahl Threads ein-/ausschalten setNested() – nested Parallelismus ein-/ausschalten getNested() – true wenn OMP-Impl. Nested Parallelismus unterstüzt

10 JOMP – Unterschiede zu C/C++
threadprivate wäre nur bei statischen Klassen möglich => unattraktiv atomic wäre lediglich Synonym für critical-Anweisung flush setzt Zugriff auf spezielle Instruktionen voraus => nicht implementiert Arrayreduktionen sind erlaubt Anzahl der Prozessoren ermitteln wäre Systemaufruf => wird nicht implementiert

11 JOMP – Performance SUN HPC 6500 (18 400MHZ, à 8MB 2nd Lvl Cache), JDK mpiJava: MPICH 1.1.2 100 redblack Iterationen auf einem 1000x1000-Feld

12 JOMP – Performance Schlussfolgerungen:
Handgeschriebene JavaThreads liefern bestes Ergebnis JOMP zeigt geringfügig schlechtere Ergebnisse JOMP skaliert gut mpiJava zeigt starke Superlinearität bis zu 8 CPUs mpiJava skaliert schlechter bei mehr als 8 CPUs Java-Versionen erreichen Hälfte der Performance der Fortran OpenMP-Version

13 JOMP – Performance Anweisung guidef90 Jomp PARALLEL 78.4 34.4 PARALLEL + REDUCTION 166.5 58.4 DO/FOR 42.3 24.6 PARALLEL DO/FOR 87.2 42.9 BARRIER 41.7 11.0 SINGLE 83.0 1293 CRITICAL 11.2 19.1 LOCK/UNLOCK 12.0 20.0 ORDERED 12.4 47.0 Vergleich des Overheads der Synchronisationskonstrukte

14 JOMP – Performance Schlussfolgerungen: JOMP schlägt guidef90 um Längen
Overheads der Locking-Synchronisation ist in JOMP höher (folgt aus Java synchronized blocks) Resultate mit Vorbehalt betrachten, da Microbenchmarks teilweise seltsame Resultate mit JIT demonstrieren können

15 JOMP – Beispiel (example.jomp)
import jomp.runtime.*; public class example{ public static void main (String args[]){ int [] a = new int [10]; int [] b = new int [10]; int [] c = new int [10]; int i; for (i = 0; i < b.length; i++){ b[i] = i + i + 1; c[i] = b[i] + 1; } int n; n = 9; //omp parallel private(i) { //omp for for (i = 0; i <= n; i++){ a[i] = b[i] + c[i]; System.out.println(a[0] + ", " + a[1] );

16 JOMP – Beispiel (example.java)
// OMP PARALLEL BLOCK BEGINS { omp_Class0 __omp_Object0=new_omp_Class0(); // shared variables __omp_Object0.n = n; __omp_Object0.c = c; __omp_Object0.b = b; __omp_Object0.a = a; __omp_Object0.args = args; // firstprivate variables try { jomp.runtime.OMP.doParallel(__omp_Object0); } catch(Throwable __omp_exception) { System.err.println("OMP Warning: Illegal thread exception ignored!"); System.err.println(__omp_exception); } // reduction variables n = __omp_Object0.n; c = __omp_Object0.c; b = __omp_Object0.b; a = __omp_Object0.a; args = __omp_Object0.args; // OMP PARALLEL BLOCK ENDS

17 JOMP – Beispiel (example.java)
// OMP PARALLEL REGION INNER CLASS DEFINITION BEGINS private static class __omp_Class0 extendsjomp.runtime.BusyTask { // shared variables int n; int [ ] c; int [ ] b; int [ ] a; String [ ] args; // firstprivate variables // variables to hold results of reduction public void go(int __omp_me) throws Throwable { // firstprivate variables + init // private variables int i; // reduction variables, init to default {// OMP USER CODE BEGINS { // OMP FOR BLOCK BEGINS ... for( i = (int)__omp_ChunkData1.start; i < __omp_ChunkData1.stop; i+= __omp_ChunkData1.step) { // OMP USER CODE BEGINS { a[i] = b[i] + c[i]; } // OMP USER CODE ENDS // OMP PARALLEL REGION INNER CLASS DEFINITION ENDS

18 JOMP – Fazit und Ausblick
Nur geringfügige Änderungen zum C/C++-Standard Nur kleiner Overhead im Vergleich zum handgeschriebenen Java-Thread-Programm Komplette Spezifikation wird wohl bald veröffentlicht werden Kleine Teile der Spezifikation bleiben noch zu implementieren


Herunterladen ppt "JOMP wittmann@in.tum.de."

Ähnliche Präsentationen


Google-Anzeigen