Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Julia<br />
Programmieren<br />
von C <strong>mit</strong> der Dynamik von Ruby. Wir<br />
wollten eine Sprache, die homoiconic sein<br />
sollte (also Code <strong>und</strong> Daten in derselben<br />
Weise repräsentiert), <strong>mit</strong> echten Makros<br />
wie in Lisp, aber <strong>mit</strong> einer eingängigen,<br />
vertrauten mathematischen Schreibweise<br />
wie in MATLAB. Wir wollten etwas, das<br />
für allgemeine Programmieraufgaben so<br />
nützlich sein sollte wie Python, so leicht<br />
<strong>mit</strong> Statistik umgehen kann wie R, für das<br />
Zeichenkettenverarbeitung so selbstverständlich<br />
ist wie für Perl, das in linearer<br />
Algebra so stark sein sollte wie MATLAB<br />
<strong>und</strong> das sich so gut zum Zusammenfügen<br />
von Programmen eignen sollte wie die<br />
Shell. Etwas, das man kinderleicht lernen<br />
kann <strong>und</strong> das doch die ernsthaftesten<br />
Hacker glücklich macht. Wir wollten das<br />
interaktiv <strong>und</strong> kompilierend. Wir wollten<br />
einfache skalare Schleifen schreiben<br />
können, die sich direkt in Maschinencode<br />
übersetzen <strong>und</strong> die CPU-Register nutzen.<br />
Gleichzeitig wollten wir »A * B« schreiben<br />
können <strong>und</strong> da<strong>mit</strong> Tausende Berechnungen<br />
anstoßen, die das Matrixprodukt<br />
bilden.“ [2]<br />
Julias Vorzüge<br />
Die Julia-Webseite [1] hat noch mehr Informationen<br />
über die Zielsetzung, aber<br />
schon der zitierte Absatz klingt, als gehe<br />
für HPC-Nutzer ein Traum in Erfüllung.<br />
Insbesondere, weil einige der Ziele seit<br />
Jahren auf der Wunschliste standen <strong>und</strong><br />
unerreichbar scheinen, bis man einen<br />
Blick auf die Benchmarks in Tabelle 1<br />
wirft. Da das „P“ in HPC ja für Performance<br />
steht, sollten die Ergebnisse dazu<br />
einladen, sich weiter <strong>mit</strong> Julia zu beschäftigen.<br />
Vielen High-Level-Sprachen<br />
wird unterstellt, weniger effizient als C<br />
oder Fortran zu sein. Die Tabelle beweist,<br />
dass das nicht so sein muss. Schon die<br />
Tabelle 1: Benchmark-Ergebnisse<br />
Julia<br />
v3f670da0<br />
Python<br />
v2.7.1<br />
Annäherung an die Geschwindigkeit der<br />
herkömmlichen, kompilierenden Sprachen<br />
kann man als Durchbruch für ein<br />
High-Level-HPC-Tool ansehen.<br />
Neben der Geschwindigkeit sollten weitere<br />
Julia-Features den Fachexperten gelegen<br />
sein.Die folgende kurze Liste ist eine<br />
Aufstellung der wichtigsten Vorzüge von<br />
Julia (eine vollständige Liste findet sich<br />
hier [3]):<br />
n Frei <strong>und</strong> Open Source (MIT-Lizenz).<br />
n Syntax wie bei MATLAB.<br />
n Entworfen für Parallelisierung <strong>und</strong><br />
verteiltes Rechnen (Multicore <strong>und</strong><br />
Cluster).<br />
n Direkter Aufruf von C-Funktionen<br />
(ohne Wrapper oder spezielle APIs)<br />
n Mächtige, Shell-ähnliche Fähigkeiten<br />
für die Verwaltung anderer Prozesse<br />
n Lisp-ähnliche Makros <strong>und</strong> andere<br />
Möglichkeiten der Metaprogrammierung.<br />
n Benutzerdefinierte Datentypen sind so<br />
kompakt <strong>und</strong> schnell wie eingebaute.<br />
n Just-in-Time-Compiler (JIT), der oft<br />
die Performance von C/C++ erreicht.<br />
n Umfangreiche mathematische Funktionen<br />
<strong>und</strong> Bibliotheken (geschrieben<br />
in Julia)<br />
n Integration ausgereifter C- <strong>und</strong> Fortran-<br />
Bibliotheken für Lineare Algebra, Zufallszahlengeneratoren,<br />
FFTs <strong>und</strong> Zeichenkettenverarbeitung.<br />
Eine Fähigkeit, die alle Hochsprachen benötigen,<br />
ist die, existierende Bibliotheken<br />
aus anderen Quellen zusammenzufügen.<br />
Es existiert zu viel guter Code, als dass<br />
man ihn ignorieren oder neu erfinden<br />
sollte. Dank der Nutzung eines LLVM-<br />
Compilers kann Julia ohne Weiteres existierende<br />
Shared Libraries verwenden, die<br />
<strong>mit</strong> GCC oder Clang-Tools kompiliert wurden.<br />
Im Ergebnis verfügt Julia über eine<br />
MATLAB<br />
vR2011a<br />
Octave<br />
v3.4<br />
R<br />
v2.14.2<br />
JavaScript<br />
v8 3.6.6.11<br />
»fib« 1.97 31.47 1,336.37 2,383.80 225.23 1.55<br />
»parse_int« 1.44 16.50 815.19 6,454.50 337.52 2.17<br />
»quicksort« 1.49 55.84 132.71 3,127.50 713.77 4.11<br />
»mandel« 5.55 31.15 65.44 824.68 156.68 5.67<br />
»pi_sum« 0.74 18.03 1.08 328.33 164.69 0.75<br />
»rand_mat_stat« 3.37 39.34 11.64 54.54 22.07 8.12<br />
»rand_mat_mul« 1.00 1.18 0.70 1.65 8.64 41.79<br />
* Tests sind relativ zu C++ <strong>und</strong> liefen auf einem MacBook Pro <strong>mit</strong> 2.53GHz Intel Core 2 Duo CPU<br />
<strong>und</strong> 8GByte 1,066MHz DDR3 RAM (Quelle: Julia-Webseite).<br />
sehr performante Methode <strong>mit</strong> geringem<br />
Overhead, um bestehende Bibliotheken<br />
auszunutzen.<br />
Eine weiteres wichtiges Feature von Julia<br />
ist die native Parallelverarbeitung auf<br />
der Basis von zwei Pri<strong>mit</strong>iven: Remote<br />
References <strong>und</strong> Remote Calls. Hinter den<br />
Kulissen benutzt Julia Message Passing,<br />
zwingt den Benutzer aber im Unterschied<br />
zu MPI nicht dazu, die Umgebung explizit<br />
zu kontrollieren. Überhaupt ist Kommunikation<br />
in Julia immer einseitig, was<br />
heißt, dass der Programmierer sich in<br />
einer zweiseitigen Operation nur um eine<br />
Seite zu kümmern braucht. Julia unterstützt<br />
außerdem verteilte Arrays.<br />
Hands on<br />
Weil Julia neu ist, befinden sich einige<br />
Aspekte der Sprache noch in Entwicklung.<br />
Die sehr gute Dokumentation [6]<br />
ist einen Blick wert. Weil die Dinge noch<br />
im Fluss sind, empfiehlt es sich das jeweils<br />
aktuellste Release aus dem Netz zu<br />
beziehen. Im Moment unterstützt Julia<br />
n GNU/LInux, x86, 64- <strong>und</strong> 32-Bit<br />
n Darwin OS/X, x86, 64- <strong>und</strong> 32-Bit<br />
n FreeBSD, x86, 64- <strong>und</strong> 32-Bit<br />
Die folgenden Beispiele wurden auf einem<br />
Limulus-Cluster [7] <strong>mit</strong> einer Intel<br />
i5-2400S-CPU <strong>und</strong> 4 GByte RAM unter<br />
Scientific Linux 6.2 gerechnet. Wer Julia<br />
nicht kompilieren möchte, kann es online<br />
ausprobieren [8]. Wer eine eigene<br />
Version haben möchte, braucht ein Arbeitsverzeichnis<br />
<strong>mit</strong> mindestens 2 GByte<br />
freiem Plattenplatz. Dort gibt man ein:<br />
git clone U<br />
https://github.com/JuliaLang/julia.git<br />
Ist der Download beendet, hat man ein<br />
neues Julia-Directory. Anschließend<br />
wechselt der Anwender dort hinein <strong>und</strong><br />
gibt »make« ein – dann hat er Zeit für<br />
einen Kaffee oder eine R<strong>und</strong>e <strong>mit</strong> dem<br />
H<strong>und</strong>. Der Build dauert eine Weile, besorgt<br />
sich aber alle nötigen Pakete selbst.<br />
Ist alles durchgelaufen, sollte sich ein<br />
Julia-Binary im Arbeitsverzeichnis finden.<br />
Um Julia zu starten, genügt<br />
./julia<br />
Erscheint dann nicht der Titel aus Listing<br />
1 versucht man es <strong>mit</strong><br />
./julia ‐q<br />
E<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 06-2012<br />
123