Java und HPC - Source Talk Tage 2006

Werbung
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
Herunterladen