26.02.2014 Aufrufe

ADMIN Magazin Gestapelt - Schneller und sicherer mit RAID (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!