Einleitung Geschichte Gegenwart Zukunft? Java und HPC Geschichte, Gegenwart und Zukunft Johannes M. Dieterich Computational Chemistry and Biochemistry Institut für Physikalische Chemie Georg-August-Universität Göttingen [email protected] Source Talk 2012 Zusammenfassung 1/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Disclaimer • subjektive Meinungen, subjektive Erfahrungen • basierend auf dem engen Bereich der Theoretischen/Computer-Chemie • überzeugter Java-Trinker • Bekanntes ignorieren • kein Informatiker :-) Beware the claims of the producer. (Peter Salamon) 2/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Zitate CLucene: http://clucene.sourceforge.net/ CLucene is a port of the very popular Java Lucene text search engine API. CLucene aims to be a good alternative to Java Lucene when performance really matters or if you want to stick to good old C++. CLucene is faster than Lucene as it is written in C++, meaning it is being compiled into machine code, has no background GC operations, and requires no any [sic] extra setup procedures. Anonymous Java is slow. Ist High Performance Computing (HPC) daher unmöglich? 3/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Computational Chemistry and Biochemistry @GAU I 4/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Computational Chemistry and Biochemistry @GAU II Molekulardynamik • biologische Systeme (>1000 Atome) • ca. 256 CPUs • 1-4 GB RAM/CPU • kein I/O • CUDA-Entwicklungen ab-initio Rechnungen und Entwicklung • kleinere Systeme (<50 Atome) • max. 24 CPUs • 8-16 GB RAM/CPU • I/O: bis zu ca. 2 TB Scratchfiles 5/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Computational Chemistry and Biochemistry @GAU III Globale Optimierung • Clusterstrukturen • Potentialentwicklungen und -fits • Moleküldesign • massiv-paralleles, Java-basiertes Paket • Rechnungen am HLRN und auf lokalen Ressourcen 6/ 49 Einleitung Geschichte Gegenwart Zukunft? Rechenressourcen Lokal • 20x 8-core Intel • 10 NVIDIA Quadro GPUs • 2x 24-core AMD Assoziiert @Kiel • 2x 48-core AMD • 1x SUN T5240 (128 CoolThreads) HLRN • SGI AltixUltraviolet 1000 • SGI Altix ICE 8200 Plus • ... Zusammenfassung 7/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Java und HPC: Geschichte • 1998 Java Grande Forum (JGF)1 • Java für Grande Applikationen (CPU/RAM/Netzwerk/I/O-intensiv) • HPC Benchmarks • HPC Bibliotheken • Konferenzen • gezielte Sprachänderungen und -erweiterungen (als JSR in JCP eingebracht) • Studien2 • 2003 letzte Aktivität des JGF War das JGF erfolgreich? Laufen Grande Applikationen in Java? 1 2 Java Grande Forum (JGF) - http://www.javagrande.org/ L. A. Smith und J. M. Bull, Java for High Performance Computing, UKHEC Technology Watch report http://www.ukhec.ac.uk/publications/tw/hpcjava.pdf 8/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Gegenwart: Der HPC-Standard HPC Programme angeschaut • Sprache: Fortran 77/90/95 (+ C/C++) • Parallelisierung: MPI und OpenMP • Skripte: Perl • Code: see for yourself... Gründe • Never change a winning team. • MegaSLOC legacy code • Support an RZs: Fortran (event. C/C++) Welche Sprachen sind für Neuentwicklungen interessant? 9/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung 10/ 49 HPC Code Beispiele I implicit double precision (a-h,o-z),integer(i-n) parameter (nat=2500) !Max number of atoms parameter (neem=2500) !Max number of atoms for EEM method parameter (na1mx3=3*nat) !3*max number of atoms parameter (navib=50) !for 2nd derivatives parameter (nsort=20) !Max number of atom types parameter (nbotym=200) !Max number of bond types parameter (nvatym=200) !Max number of valency angle types parameter (ntotym=200) !Max number of torsion angle types parameter (nhbtym=200) !Max number of hydrogen bond types parameter (nodmtym=50) !Max number of off-diagonal Morse types parameter (nbomax=25000) !Max number of bonds parameter (nhbmax=250000) !Max number of hydrogen bonds parameter (nvamax=250000) !Max number of valency angles parameter (nopmax=00010) !Max number of out of plane angles parameter (ntomax=40000) !Max number of torsion angles parameter (npamax=50) !Max number of general parameters in forc parameter (nmolmax=1500) !Max number of molecules in system parameter (nmolset=2500) !Max number of molecules in training s parameter (mbond=120) !Max number of bonds connected to one parameter (mrestra=080) !Max number of restraints parameter (maxsrest=020) !Max number of atoms defined in sym Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung 11/ 49 HPC Code Beispiele II parameter (mtreg=100) !Max number of temperature regimes parameter (mtzone=5) !Max number of temperature zones parameter (mvreg=100) !Max number of volume regimes parameter (mvzone=6) !Max number of volume zones parameter (mereg=100) !Max number of electric field regimes parameter (mezone=3) !Max number of electric field zones parameter (mpist=100) !Max number of piston regimes character*1 qr,qrset,qresi2 character*2 qa,qas,qaset,qadd character*3 qresi1 character*5 qvtype,qetype,qptype character*5 qlabel,qffty,qbgfaxes,qbgfsgn,qresi3 character*6 qrstras character*20 qkeyw character*25 qfile character*40 qffield,qformat,qruid,qstrana2 character*60 qmol,qremark,qremset,qmolset character*200 qstrana1 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung 12/ 49 HPC Code Beispiele II common $/cbka/ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ dbondc(nbomax,3,2*mbond),dbodc(nbomax,3,2), dbosidc(nbomax,3,2),dbosindc(nbomax,3,2*mbond), dbopindc(nbomax,3,2*mbond),drdc(nbomax,3,2), dbopi2ndc(nbomax,3,2*mbond),dbopi2dc(nbomax,3,2), dargtdc(ntomax,3,4),dcell(3,nat,27), dbopidc(nbomax,3,2),dhdc(nvamax,3,3),cset(nmolset,nat,3), dhbdc(nhbmax,3,3),chaset(nmolset,nat),cp(nat,3), cadd(nat,3),d2(3*navib,3*navib), c(nat,3),d(3,nat),accel(3,nat),rrstraset(nmolset,mrestra) vkrstrset(nmolset,mrestra),vkrst2set(nmolset,mrestra), rrchaset(nmolset,mrestra),vkrtset(nmolset,mrestra), vkr2tset(nmolset,mrestra),trstraset(nmolset,mrestra), vrstraset(nmolset,mrestra),vkrvset(nmolset,mrestra), vkr2vset(nmolset,mrestra),cmo(nat,3),veladd(3,nat), aold(3,nat),vel(3,nat),dic(3,nat),pvdw1(nsort,nsort), rcore(nsort,nsort),ecore(nsort,nsort),acore(nsort,nsort), pvdw2(nsort,nsort),angimp(nat,6),axisset(nmolset,3), anglesset(nmolset,3),formolset(nmolset),vvolset(nmolset), yt(na1mx3),pt(na1mx3),gi(na1mx3),enmolset(nmolset), enmolend(nmolset),formolend(nmolset),endposet(nmolset), ai(na1mx3),bi(na1mx3),yi(na1mx3),pn(na1mx3),tbo(nat), dvlpdsbo(nat),chgbgf(nat),estrain(nat), Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Anforderungen von HPC Applikationen • architekturneutrale numerische Stabilitaet • Nutzbarkeit verschiedener Ressourcen • einfache Nutzbarkeit der Sprache • Performance • Verfügbarkeit numerischer Bibliotheken • Parallelisierungsmöglichkeiten (shared und distributed memory) • gute Verfügbarkeit von Entwicklungswerkzeugen • gute Wartbarkeit • neu: neue Datenstrukturen (Bäume, Hashtabellen, etc) Wie schlägt sich Java? 13/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Performance Vorbedingungen • Makrooptimierungen3 • Mikrooptimierungen • Arrays vs Lists • Math.pow(x,4); vs x*=x; x*=x; • schnelle vs langsame Laufindices a[slow][fast] • Reduktion von Fliesskommaoperationen • kaum Objekterzeugung und -freigabe • objektorientierte Numerik spielt keine Rolle4 • Optimierung von JVM-Flags und Switches? -Xmx, -Xms etc. Was ist die sprachinheränte Performance von Java vs Fortran/C/C++? Für HPC? 3 4 J. Bloch, Effective Java 2nd edition, Addison-Wesley, 2008. Referenz: D. H. Besset, Object-oriented implementation of numerical methods, Morgan Kaufmann, 2000 14/ 49 Einleitung Geschichte Gegenwart Zukunft? Benchmarks für HPC I: Problemstellungen Typische Probleme • Matrixmultiplikation • Matrixdiagonalisierung • Fast Fourier Transformation • dünn besetze Matrizen • lineare Gleichungssysteme Einheit • Floating point operations per second (Flops) Zusammenfassung 15/ 49 Einleitung Geschichte Gegenwart Zukunft? Benchmarks für HPC II: Bekanntes Klassische Probleme • Statistik nicht vorhanden (report your fastest result) • Problemgrössen zu klein • Problemtyp nicht richtig • Vergleichbarkeit nicht vorhanden • missing flags Gute Ansätze 1. Computer Language Benchmark Game 5 • wenig Numerik/HPC-orientiert 2. Google’s Benchmark6 • ein Problem, primär Objektallokation/-freigabe 5 6 Computer Language Benchmark Game - http://shootout.alioth.debian.org/ R. Hundt, Loop Recognition in C++/Java/Go/Scala, 2011. https://days2011.scala- lang.org/sites/days2011/files/ws3- 1- Hundt.pdf Zusammenfassung 16/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung 17/ 49 CLucene: Benchmark i realise that these statistics are pretty rough, but i thought in the spirit of doing beat offs on lucene, i’d throw in my search engine into the ring... see what people have to say. i’m not going to attempt to show off using pretty graphs and mean/median/max charts. rather, i am going to hope to get some sort of stability out of doing the same test over and over again - and all tests will be run in one lump, so the start up of the VM will be ’masked’ by the amount of time that it runs for. comparison between apache lucene (i will call it jlucene) and clucene. machine is a pentium 4 running windows xp with 1gb ram. indexed data: indexing 663mb (797 files) of guttenberg texts (some files removed and no graphics,etc): java notes: using default memory -Xmx, etc. I wanted to not put any restrictions on maxFieldsLenght, but it ran out of memory. so i restricted maxFieldLength to 100,000 terms. used the demo programs. indexing was first run with java maxFieldsLength left at 10,000. the whole directory was indexed in one hit. jlucene indexing completed in 136219 ms. peak memory usage ˜15mb, average ˜12mb clucene(memory optimized) indexing completed in 53735 ms. peak memory usage ˜7.5mb, average ˜1.7mb clucene(speed optimized) <SNIP> ben (clucene) Official benchmark: http://sourceforge.net/apps/mediawiki/clucene/index.php? title=Benchmarks Einleitung Geschichte Gegenwart Zukunft? Linpack Eigenschaften • der Benchmark für Supercomputer7 • Fortran und C/C++ Versionen offiziell • Lösung eines linearen Gleichungssytems A~ x = ~b Probleme • Java-Version völlig veraltet8 • 200x200 bzw. 500x500 Matrix viel zu klein • zu wenig Abdeckung der charakteristischen HPC-Probleme 7 8 http://www.top500.org/ Linpack for Java - http://www.netlib.org/benchmark/linpackjava/ Zusammenfassung 18/ 49 Einleitung Geschichte Gegenwart Zukunft? Java Grande Forum Benchmark Eigenschaften • Section I: Low-Level Benchmarks zum JVM-Vergleich • Section II: Kernel Benchmarks für Numerik • Section III: Applikationen Probleme • keine Weiterentwicklung9 • native Version halboffiziell • Nutzbarkeit zu wirr • Ergebnisse veraltet10 9 Java Grande Benchmark http://www2.epcc.ed.ac.uk/computing/research_activities/java_grande/index_1.html 10 L. A. Smith und J. M. Bull, Java for High Performance Computing, UKHEC Technology Watch report http://www.ukhec.ac.uk/publications/tw/hpcjava.pdf Zusammenfassung 19/ 49 Einleitung Geschichte Gegenwart Scimark 2 Eigenschaften • Subset des JGF Benchmarks • ausschliesslich numerische Kernel • echte, identische C-Version verfügbar Probleme • Entwicklung eingeschlafen11 11 SciMark 2.0 - http://math.nist.gov/scimark2/ Zukunft? Zusammenfassung 20/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Routinen I: SOR public static final void execute(double omega, double G[][], int num_iterations) { int M = G.length; int N = G[0].length; double omega_over_four = omega * 0.25; double one_minus_omega = 1.0 - omega; // update interior points int Mm1 = M-1; int Nm1 = N-1; for (int p=0; p<num_iterations; p++){ for (int i=1; i<Mm1; i++){ double[] Gi = G[i]; double[] Gim1 = G[i-1]; double[] Gip1 = G[i+1]; for (int j=1; j<Nm1; j++) Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j-1] + Gi[j+1]) + one_minus_omega * Gi[j]; } } } Sucessive Over Relaxation (SOR) auf einem NxN Grid zur Lösung eines linearen Gleichungssystems (Arrayzugriffe). 21/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Routinen II: SparseRowComp public static void matmult( double y[], double val[], int row[], int col[], double x[], int NUM_ITERATIONS){ int M = row.length - 1; for (int reps=0; reps<NUM_ITERATIONS; reps++){ for (int r=0; r<M; r++){ double sum = 0.0; int rowR = row[r]; int rowRp1 = row[r+1]; for (int i=rowR; i<rowRp1; i++) sum += x[ col[i] ] * val[i]; y[r] = sum; } } } Matrix-Vektor-Multiplikation einer dünnbesetzten Matrix (nichtregulärer Memoryzugriff). 22/ 49 Einleitung Geschichte Gegenwart Zukunft? Routinen III • FFT: Fast Fourier Transformation komplexe Arithmetrik, trigonometrische Funktionen • LU: Lösung eines NxN LGS (siehe Linpack) Memory und Fliesskommaoperationen • MonteCarlo: Monte Carlo Integration Funktionssprünge • eigener Zufallszahlengenerator zur Vergleichbarkeit FFT SOR LU Sparse MonteCarlo klein groß 1024 100 100 1000/5000 2 sec 1048576 1000 1000 100000/1000000 2 sec Zusammenfassung 23/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Ergebnisse I: FreeBSD 3000 gcc42 -O2 gcc42 -O3 gcc46 gcc46 -O2 gcc46 -O3 clang -O2 clang -O3 diablo openjdk7 performance [MFlops] 2500 2000 1500 1000 • OS: 10.0-CURRENT, CPU: Intel core-i5 2520M • gcc-4.2.2, gcc4.6.2, clang 3.0, diablo6 b07 • -ffast-math -march=corei7/nocona co m C M U p rs e Details lL R lS pa lS O FT lF sL U R sS pa sS O sF FT 0 rs e 500 24/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Ergebnisse II: Linux 2500 gcc4.5.1 -O3 icc12.1.0 -fast openjdk7 performance [MFlops] 2000 1500 1000 co m M C p rs e U lL R lS pa lS O FT lF sL U R sS pa sS O sF FT 0 rs e 500 Details • OS: openSuSE 11.4, CPU: Intel Core2Quad Q9550 • gcc-4.5 -march=native -mtune=native -ffast-math 25/ 49 Einleitung Geschichte Gegenwart Zukunft? Performance: Zwischenfazit Probleme • trigonometrische Funktionen (1 ulp Genauigkeit ist langsam) • GC-intensive Codes (falscher Algorithmus/Implementation?) • verringerte Parallelisierbarkeit bei hohem GC-Einsatz Folgerung • Performance ist kompetetiv • weitere Verbesserungen natürlich gut • Vergleich mit Fortran-Implementation (Freiwillige?) • Algorithms for Performance! Zusammenfassung 26/ 49 Einleitung Geschichte Gegenwart Zukunft? Time to solution: Zählt nur die Runtime? Weitere Faktoren • Implementationsdauer • Debuggingdauer • Portierungsaufwand • Wartbarkeitsaufwand • Optimierungsaufwand Beobachtungen12 • C++ höchster Optimierungsaufwand • Java schnell zu implementieren • GC-Tuning mit Java schwierig 12 R. Hundt, Loop Recognition in C++/Java/Go/Scala, 2011. https://days2011.scala- lang.org/sites/days2011/files/ws3- 1- Hundt.pdf Zusammenfassung 27/ 49 Einleitung Geschichte Gegenwart Zukunft? Parallelisierung Herausforderung • Anzahl der Rechenkerne in RZs explodiert • Anpassung der numerischen Codes notwendig Lösungsansatz 1. alter Algorithmus • schleifenbasierte Parallelisierung 2. neuer Algorithmus • inhärent parallel Zusammenfassung 28/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung MPI: Message Passing Interface • Industriestandard seit 199313 • Aktuell zwei Versionen wichtig: 1.3 (MPI-1) und 2.0 (MPI-2) • Tool der Wahl für distributed memory Clustersysteme • Standadisiert nur die Kommunikation, nicht Compilation/Start • Enthalt neben Kommunikationsprimitiven (broadcast, send, receive,..) auch Rechenfunktionen (Collective Computations/Reductions) • Implementation typischerweise mit Fortran/C/C++-Bindings • Diverse (gepatchte) Implementationen verfügbar (openmpi, mvapich, mpich, LAM,...) Java? 13 http://en.wikipedia.org/wiki/Message_Passing_Interface 29/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung MPJexpress • reine Java-Implementation von MPI-2 • Kommunikation mittels RMI (TCP/IP) bzw. nativem Call (Infiniband) • aktiv weiterentwickelt • keine Queueing-System-Integration • keine Nutzung “hochoptimierter, speziell angepasster, nativer MPI-Implementationen” (HLRN) Abhängig vom Rechenzentrum akzeptiert oder nicht akzeptiert. 30/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung MPJexpress: Code try { MPI.Init(args); } catch (Exception e) { e.printStackTrace(); try { MPI.COMM_WORLD.Abort(42); } catch (Exception e2) { e2.printStackTrace(); System.exit(42) } } MPI.COMM_WORLD.Bcast(caConfigMessage, 0, 50, MPI.CHAR, 0); Status status = MPI.COMM_WORLD.Recv(caMessage, 0, 77, MPI.CHAR, 0, MPI.ANY_TAG); MPI.Finalize(); 31/ 49 Einleitung Geschichte Gegenwart Zukunft? mpiJava • gleiche API wie MPJexpress14 • subtil andere Aufrufargumente • basiert auf einem erweiterten JNI-Wrapper • dadurch gute Integration in Rechenzentren • letzte Version von 2003 • Probleme: • veraltete Autotools • 64-bit Support muss gepatcht werden • Makefile veraltet • Bugs in einigen Reduction-Routinen Dringend Updates/aktivere Entwicklung notwendig. 14 Bryan Carpenter Mitentwickler beider Projekte. http://www.hpjava.org/mpiJava.html Zusammenfassung 32/ 49 Einleitung Geschichte Gegenwart Zukunft? Java build-in: Threads, RMI und CORBA JVM-only Applikationen • Threads für shared-memory • RMI für Cloud/Cluster Konfigurationen Multisprachen Apps • CORBA • SOAP? Parallelisierung quasi eingebaut! Zusammenfassung 33/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Parallelisierung: Echte Skalierungen (a) Threads 14 14 RMI average threads average 12 40 6 8 6 4 4 2 2 0 0 0 2 4 6 8 10 12 35 scaling 8 RMI average threads average 45 10 scaling scaling 50 RMI average threads average 12 10 (b) mpiJava 30 25 20 15 10 5 0 0 2 4 6 8 number of cores number of cores (c) RMI: SMP (d) RMI: Cloud 10 12 0 5 10 15 20 25 30 35 40 45 number of cores (e) RMI: Cluster 34/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Werkzeugkasten 15 Fortran Java Debugger Profiler WRITE(*,*) time(1) Compiler BLAS/LAPACK Portland/Intel XE z.B. MKL diverse z.B. YourKit Profiler15 remote profiling javap – ? http://www.yourkit.com/ 35/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Biobliotheken: Das Minimum HPC-Bibliotheken • BLAS/LAPACK: lineare Algebra • Level 1: Vektoroperationen • Level 2: Matrix-Vektor-Operationen • Level 3: Matrix-Matrix-Operationen • Fast Fourier Transform • anwendungsspezifische Bibliotheken (automatic differentation, sparse matrix, ...) JNI? • Zugang nativer Bibliotheken möglich • JNI-Calls kosten Zeit • keine Architekturneutralität Performante Java-Implementationen wichtig. 36/ 49 Einleitung Geschichte Gegenwart Zukunft? f2j: netlib BLAS/LAPACK Features • automatische Übersetzung der netlib16 • Fortran zu JVM-Bytecode (f2j) • auch Tool für andere f77 Subroutinen • aktive Entwicklung Code static double[][] matMultNetlib(double[][] a, double[][] b){ int rowsA = a.length; // Anzahl Reihen A und C int colsB = b[0].length; // Anzahl Spalten B und C int colsA = a[0].length; // Anzahl Spalten A, Reihen B double[][] c = new double[rowsA][colsB]; String transA = "n"; // op(A) = A String transB = "n"; // op(B) = B double alpha = 1.0; double beta = 0.0; // C := alpha*op(A)*op(B) + beta*C // mit op(X) = X oder op(X) = X**T, DGEMM.DGEMM(transA, transB, rowsA, colsB, colsA, alpha, a, b, beta, c); return c; } 16 f2j - http://icl.cs.utk.edu/f2j/ Zusammenfassung 37/ 49 Einleitung Geschichte Gegenwart Zukunft? JAMA Features • NIST Entwicklung der wichtigsten Matrixoperationen für dichte Matrizen17 • sehr einfache Nutzbarkeit • Implementation relativ performant • Entwicklung abgeschlossen Code static double[][] matMultJama(double[][] a, double[][] b){ Matrix matA = new Matrix(a); Matrix matB = new Matrix(b); Matrix matC = matA.times(matB); return matC.getArray(); } 17 JAMA: A Java Matrix Package - http://math.nist.gov/javanumerics/jama/ Zusammenfassung 38/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung UJMP Features • komplettes Matrixpaket (dichte und dünnbesetze Matrizen, Visualisierung, etc.)18 • Performance-orientiert • ähnlich einfach wie Jama zu nutzen allerdings teilweise zu mächtig • aktive Entwicklung Code static double[][] matMultUJMP(double[][] a, double[][] b){ int rowsA = a.length; int colsA = a[0].length; int rowsB = b.length; int colsB = b[0].length; org.ujmp.core.Matrix matA = org.ujmp.core.MatrixFactory.dense(ValueType.DOUBLE, rowsA, colsA); org.ujmp.core.Matrix matB = org.ujmp.core.MatrixFactory.dense(ValueType.DOUBLE, rowsB, colsB); for(int i = 0; i < rowsA; i++){ for(int j = 0; j < colsA; j++) matA.setAsDouble(a[i][j], i,j); } for(int i = 0; i < rowsB; i++){ for(int j = 0; j < colsB; j++) matB.setAsDouble(b[i][j], i,j); } org.ujmp.core.Matrix matC = matA.times(matB); double[][] c = new double[rowsA][colsB]; for(int i = 0; i < rowsA; i++){ for(int j = 0; j < colsB; j++) c[i][j] = matC.getAsDouble(i,j); } return c; } 39/ 49 Einleitung Geschichte Gegenwart Zukunft? Fast Fourier Transform (FFT) • Standardtool • Quantendynamik • plane-wave DFT • Vorreiter: Intel MKL und FFTW19 • Java: JNI-Wrapper für FFTW JNI Overhead: einige ms20 Multisprachen-Architektur? 19 20 FFTW - http://www.fftw.org/index.html D. Kurzyniec, V. Sunderam, Efficient Cooperation between Java and Native Codes (JNI Performance Benchmark), . Zusammenfassung 40/ 49 Einleitung Geschichte Gegenwart Zukunft? Spezielle Bibliotheken Beobachtungen • Verfügbarkeit unterschiedlich • tendentiell: JNI-Wrapper (wenn möglich) Beispiel • Automatische Differentation (AD) • C/C++: 12 Pakete • Fortran: 5 Pakete • Python: 7 Pakete • C#: 2 Pakete • Haskell: 3 Pakete • Java: 1 Paket Zusammenfassung 41/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Was fehlt? • Funktionspointer • Operatorüberladung ~a = a = A ~a = = ~x × ~y ~x · ~y (1) X ×Y X × ~y (3) • primitiver Datentyp für komplexe Zahlen ai + b • rectangular Arrays21 • schnelle trigonometrische Funktionen 21 siehe: JGF - multiarray package - JSR 83 (withdrawn) (2) (4) 42/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Zukunft: Java und GPUs? Rootbeer22 • neues Framework • erzeugt per statitischer Analyse via Soot nativen CUDA/OpenCL-Code aus Java-Bytecode • sinnvoll für Aufgaben wie z.B. große Matrixmultiplikation (67x Speedup23 ) Anderes • diverse JNI-basierte CUDA/OpenCL-Wrapper (z.B. JOCL, JavaCL, LWJGL,...) • ATI/AMD-only: Aparapi24 • Oracle/AMD planen allgemeine Lösung (Lambdas? Java8?)25 22 23 24 25 https://github.com/pcpratts/rootbeer1 Phil Pratt-Szeliga, HPCC2012, siehe Rootbeer Docu. https://code.google.com/p/aparapi/ http://mail.openjdk.java.net/pipermail/discuss/2012- August/002717.html 43/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Zukunft Java • gezielte Sprachänderungen unwahrscheinlich • JVM-Performanceverbesserungen wahrscheinlich JVM 1. Project Fortress26 • secure Fortran • läuft auf der JVM • Sun’s Kandidat für die High Productivity Computing Systems (HPCS) Intitiative (bis 2006) • aktive Entwicklung • interessante Sprachfeature 2. Scala 26 Project Fortress - http://projectfortress.java.net/ 44/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Scala für HPC? • Funktionspointer • Operatorüberladung • volle Kompatibilität mit Java-Bibliotheken • Actor-basierte Parallelisierung (message passing) • native BLAS/LAPACK: Scalala27 (mit netlib-Wrapper) • stark weiterentwickelte Sprache, daher Möglichkeiten für spezielle Erweiterungen? Performance?! 27 Scalala: https://github.com/scalala/Scalala 45/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Scamark2: Scimark2 reloaded Disclaimer 2 • eigene quick’n’dirty Übersetzung28 • getestet aber sicher nicht bugfrei • Version nicht scalaisiert Performance29 FFT SOR MC Sparse LU 28 29 small J7@B S@B J7@L S@L large J7@B S@B J7@L S@L 778 1194 655 1176 2416 576 832 232 158 713 499 1000 440 792 1520 369 675 181 149 415 153 1077 651 1273 1666 154 829 231 268 974 102 932 440 739 1094 96 720 181 85 655 Download: ravel.pctc.uni- kiel.de/ogolem/scamark2.tar.gz 13 unabhäengige Läufe, davon 10 gemittelt. S = Scala 2.9.1 auf Java7, J7 = Java7, L = Linux, B = BSD. Alle Werte in MFlops. 46/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Scamark2: Scimark2 reloaded II Scala und Schleifen • for-Schleifen sind iteratorbasiert (via Range) • while-Schleifen entsprechen dem Java-Äquivalent • Widerspruch zur maximalen Eleganz... 2500 scalac-2.9.1 -optimise icc12.1.0 -fast openjdk7 1500 1000 500 M C rs e U lL R pa O lS lS lF FT se R ar sL U sS p sS O T 0 sF F performance [MFlops] 2000 47/ 49 Einleitung Geschichte Gegenwart Zukunft? Zusammenfassung Time to solution • SLOC: Scala 0.5-1.0, Java 1.6-1.9, C++ 1.3 • Toolkits von Java nutzbar • simple to use, hard to master Scala concise notation and powerful language features allowed for the best optimization of code complexity.30 30 R. Hundt, Loop Recognition in C++/Java/Go/Scala, 2011. https://days2011.scala- lang.org/sites/days2011/files/ws3- 1- Hundt.pdf 48/ 49 Einleitung Geschichte Gegenwart Zukunft? Java/JVM und HPC? • möglich (Vorteile überwiegen Nachteile) • JGF war erfolgreich • JVM durch Scala potentiell sehr erfolgreich • dennoch bleiben Probleme und Schwierigkeiten • projektabhängig, ob Java/die JVM eine gute Wahl ist Sit down and code! Zusammenfassung 49/ 49