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