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.

Programmieren<br />

Julia<br />

lich vier lokale Cores, kommt man auf<br />

3,71 Sek<strong>und</strong>en.<br />

Parallelarbeit<br />

Schon aus der Geschwindigkeit lässt sich<br />

ablesen, dass Julia die Aufgabe parallel<br />

abgearbeitet hat (alternativ kann man<br />

sich die Worker-Prozesse auch <strong>mit</strong> »top«<br />

ansehen). Zu beachten ist, dass diese einfache<br />

Schleife keine Informationen über<br />

Anzahl oder Ort der Cores brauchte. Das<br />

ist ein sehr mächtiges Feature, weil man<br />

da<strong>mit</strong> eine Applikation zunächst auf einer<br />

kleinen Anzahl Cores laufen lassen<br />

kann, die sich später vergrößern lässt.<br />

Obwohl diese Methode nicht immer für<br />

Effizienz garantiert, ist es doch immer<br />

hilfreich, wenn der Programmierer von<br />

der Buchführung bei der Parallelarbeit<br />

entlastet wird. Viele andere nützliche<br />

Funktionen sind eine Untersuchung wert,<br />

etwa »myid()«, die eine eindeutige Prozessornummer<br />

zurückgibt, die der Identifizierung<br />

dient.<br />

Der zweite Weg Cores hinzuzufügen<br />

benützt die Grid Engine [10] <strong>und</strong> die<br />

Funktion »addprocs_sge()«. Andere Scheduler<br />

wie Torque werden in der Zukunft<br />

wohl auch unterstützt. Das unscheinbare<br />

Feature erlaubt es, Programmen unter<br />

Einbeziehung des gesamten Clusters zu<br />

skalieren. Da<strong>mit</strong> lassen sich Programme<br />

konstruieren, die sich dynamisch <strong>und</strong><br />

selbstständig die benötigten Ressourcen<br />

zusammensuchen.<br />

So könnte eine Applikation auf dem Notebook<br />

eines Benutzers laufen, aber Cores<br />

eines Clusters anfordern. Kann sie nicht<br />

bedient werden, könnte sie sich selbst<br />

beenden oder aber warten, bis die Ressourcen<br />

verfügbar sind. Einige Features<br />

Listing 3: Nodes hinzufügen<br />

01 julia> addprocs_ssh({"n0","n2"})<br />

der selbst in Julia geschriebene Parallel<br />

Computing-Komponente, etwa das Entfernen<br />

nicht mehr benötigter Cores oder<br />

ein besseres Recovery, sind derzeit noch<br />

in Entwicklung.<br />

Ein anderes interessantes Szenario ist<br />

eine HPC-Workstation, bei der der Anwender<br />

oder ein Scheduler automatisch<br />

Cores freischaltet, sobald sie gebraucht<br />

werden. Das Julia-Programm könnte sich<br />

da<strong>mit</strong> selbst verwalten <strong>und</strong> selbstständig<br />

Ressourcen anfordern, sobald sie nötig<br />

sind. Der Anwender muss dabei niemals<br />

über Nodes oder Batch Queues nachdenken,<br />

sondern kann sich ganz auf das<br />

Problem konzentrieren, das er lösen will,<br />

statt auf die Details der Parallelverarbeitung.<br />

Teile <strong>und</strong> herrsche<br />

Den Nutzer von der Verantwortung für<br />

das Managen der Kommunikation <strong>und</strong><br />

Synchronisation zu entbinden, hat viele<br />

Vorteile. Wie die Arbeit dabei genau<br />

verteilt wird, ist dabei für den Anwender<br />

transparent. Julia startet viele parallele<br />

Berechnungen als Task oder Co-<br />

Routinen. Immer, wenn der Code eine<br />

Kommunikationsroutine wie »fetch()«<br />

oder »wait()« erfordert, suspendiert der<br />

Scheduler zunächst die aktuelle Task<br />

<strong>und</strong> lässt eine andere laufen. Wenn der<br />

Wait-Event beendet ist (weil beispielsweise<br />

die Daten berechnet sind) wird die<br />

suspendierte Task anschließend wieder<br />

aufgenommen.<br />

Dieses Design hat den großen Vorteil,<br />

dass sich der Nutzer nicht explizit um die<br />

Synchronisation kümmern muss. Zusätzlich<br />

erlaubt dieses dynamische Scheduling<br />

die recht einfache Implementierung<br />

02 ProcessGroup(1,{LocalProcess(), Worker("10.0.0.1",9009,4,IOStream(),IOStream(),{},<br />

03 {},2,false) ... },{Location("",0), Location("10.0.0.1",9009) ... Location("10.0.0.12",9009)},4,<br />

04 {(1,0)=>WorkItem(bottom_func,(),false,(thunk(AST(lambda({},{{#1, #2}, {{#1, Any, 2}, {#2, Any, 2}}, {}},<br />

05 begin<br />

06 #1 = top(Array)(top(Any),2)<br />

07 top(arrayset)(#1,1,"n0")<br />

08 top(arrayset)(#1,2,"n2")<br />

09 #2 = #1<br />

10 return addprocs_ssh(#2)<br />

11 end<br />

12 ))),1),(),(),intset(1))})<br />

13 julia> nprocs()<br />

14 4<br />

von Master/​Worker-Umgebungen nach<br />

dem Schema "Teile <strong>und</strong> herrsche".<br />

In Entwicklung<br />

Obwohl Julia eine vielversprechende<br />

Sprache für das technische Computing<br />

ist, ist sie noch sehr jung <strong>und</strong> unterliegt<br />

vielen Veränderungen Aus diesem<br />

Gr<strong>und</strong> ist Julia zum jetzigen Zeitpunkt<br />

noch nicht für den harten Produktiveinsatz<br />

geeignet, wohl aber zur spielerischen<br />

Auseinandersetzung auf so gut<br />

wie jedem Desktop-PC. Es sind sowohl<br />

Source- wie Binary-Pakete <strong>mit</strong> Hinweisen<br />

für die Installation auf [5] verfügbar.<br />

Dieser Beitrag konnte nur einen kleinen<br />

Einblick in Julias Fähigkeiten zur Parallelverarbeitung<br />

geben, aber hoffentlich<br />

schon ein Gefühl für die Leistungsstärke<br />

von Julias Parallelverarbeitungsmodell<br />

ver<strong>mit</strong>teln.<br />

Schließlich soll Julia nicht herabgemindert<br />

werden, wenn es manchmal als<br />

„Bastlersprache“ bezeichnet wird. Es ist<br />

gerade ein großer Vorteil von Julia, dass<br />

die Hürden für erste Versuche niedrig liegen.<br />

Wer <strong>mit</strong> MATLAB vertraut ist, wird<br />

einen einfachen Zugang finden.<br />

Das Nette am Basteln ist, man kann einfache<br />

Dinge schnell probieren, Ideen testen,<br />

<strong>und</strong> nach kurzer Zeit einen Prototyp<br />

fertig haben. Das dieser Prototyp dann so<br />

schnell läuft wie in „richtigem“ Code ist<br />

ein willkommener Vorteil. (jcb) n<br />

Infos<br />

[1] Julia: [http:// julialang. org/]<br />

[2] Der Julia Blog: [http:// julialang. org/ blog/​<br />

2012/ 02/ why‐we‐created‐julia/]<br />

[3] Julia manual:<br />

[http:// julialang. org/ manual/]<br />

[4] LLVM: [http:// en. wikipedia. org/ wiki/​<br />

Low_Level_Virtual_Machine]<br />

[5] Julia Download: [https:// github. com/​<br />

JuliaLang/ julia# readme]<br />

[6] Julia Dokumentation:<br />

[http:// docs. julialang. org/ en/ latest/]<br />

[7] Limulus: [http:// limulus.​<br />

basement‐supercomputing. com/]<br />

[8] Julia Online Test: [http:// julia. forio. com/]<br />

[9] Parallel-Programmier-Beispiel: [http://​<br />

docs. julialang. org/ en/ latest/ manual/​<br />

parallel‐computing/]<br />

[10] Grid Engine:<br />

[http:// gridscheduler. sourceforge. net/]<br />

126 Ausgabe 06-2012 Admin www.admin-magazin.de

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!