2016-06-15 5 views
12

Wie der Titel sagt: Was genau ist der Unterschied zwischen @parallel und pmap? Ich meine nicht, dass das Offensichtliche ein Makro für eine Schleife ist, und die anderen arbeiten an Funktionen, ich meine, wie genau unterscheidet sich ihre Implementierung und wie sollte ich dieses Wissen verwenden, um zwischen ihnen zu wählen? Der Grund, warum ich frage, ist, dass viele der Anwendungen, die ich schreibe, entweder Konstrukt verwenden könnte: Ich könnte eine Schleife schreiben und etwas mit @parallel berechnen, oder was würde in der Schleife in eine Funktion sein und pmap darauf aufrufen . Ich habe den Ratschlag der Verwendung von @parallel für Dinge, die schnell zu bewerten sind und pmap für Anrufe, wo jede Aufgabe dauert viel länger (wie es in der Dokumentation angibt), aber ich fühle, dass, wenn ich ein besseres Verständnis von dem, was ich mache wäre in der Lage, bessere Entscheidungen zu treffen.Was genau ist der Unterschied zwischen @parallel und pmap?

Zum Beispiel: teilt sich @parallel die Arbeit vor der Auswertung auf? Ich habe festgestellt, dass @parallel lange dauern kann, wenn ich eine Parallelschleife benutze, bei der jeder innere Aufruf eine zufällige Zeit benötigt, weil am Ende nur noch wenige Prozesse funktionieren. pmap auf dem gleichen Mikrotest scheint dies nicht zu haben: ist pmap die Arbeit nach Bedarf verteilen?

Andere Fragen wie diese stammen alle aus meiner Unkenntnis, wie genau pmap von @parallel unterscheidet.

Antwort

13

@parallel werden die zu erledigenden Aufgaben übernehmen und unter den verfügbaren Mitarbeitern sofort verteilen. Hinweis in der [email protected] erhalten wir The specified range is partitioned ... across all workers.pmap im Gegensatz dazu wird jeder Arbeiter auf einen Job zu starten. Sobald ein Arbeiter mit einem Job fertig ist, gibt er ihm den nächsten verfügbaren Job. Es ähnelt dem queuebasierten Multiprocessing, wie es zB in Python üblich ist. Es handelt sich also nicht so sehr um eine "Umverteilung" von Arbeit, sondern vielmehr darum, sie nur zur richtigen Zeit und an den richtigen Arbeiter abzugeben.

Ich habe das folgende Beispiel, das ich glaube, dies illustriert. In diesem etwas dummen Beispiel haben wir zwei Arbeiter, von denen einer langsam und der andere doppelt so schnell ist. Idealerweise würden wir dem schnellen Arbeiter doppelt so viel Arbeit geben wie dem langsamen Arbeiter. (Oder, realistischer, wir hätten schnelle und langsame Jobs, aber das Prinzip ist genau dasselbe). pmap wird dies erreichen, aber @parallel wird nicht.

Für jeden Test initialisieren ich folgendes:

addprocs(2) 

@everywhere begin 
    function parallel_func(idx) 
     workernum = myid() - 1 
     sleep(workernum) 
     println("job $idx") 
    end 
end 

Nun, für die @parallel Test, ich laufe folgendes:

@parallel for idx = 1:12 
    parallel_func(idx) 
end 

Und zurück Druckausgabe:

julia> From worker 2: job 1 
    From worker 3: job 7 
    From worker 2: job 2 
    From worker 2: job 3 
    From worker 3: job 8 
    From worker 2: job 4 
    From worker 2: job 5 
    From worker 3: job 9 
    From worker 2: job 6 
    From worker 3: job 10 
    From worker 3: job 11 
    From worker 3: job 12 

Es ist fast süß. Die Arbeiter haben die Arbeit gleichmäßig "geteilt". Beachten Sie, dass jeder Worker 6 Jobs abgeschlossen hat, obwohl Worker 2 doppelt so schnell wie Worker 3 ist. Es mag berühren, aber es ist ineffizient.

Für die pmap Test, ich laufe folgendes:

pmap(parallel_func, 1:12) 

und erhalten den Ausgang:

From worker 2: job 1 
From worker 3: job 2 
From worker 2: job 3 
From worker 2: job 5 
From worker 3: job 4 
From worker 2: job 6 
From worker 2: job 8 
From worker 3: job 7 
From worker 2: job 9 
From worker 2: job 11 
From worker 3: job 10 
From worker 2: job 12 

Nun beachten Sie, dass Arbeiter 2 8 Arbeitsplätze durchgeführt hat und Arbeiter 3 hat 4 durchgeführt Dies ist genau im Verhältnis zu ihrer Geschwindigkeit und was wir für optimale Effizienz wollen. pmap ist ein harter Aufgabenmaster - von jedem nach ihren Fähigkeiten.

Daher sind die Empfehlungen in den Julia-Dokumenten sinnvoll. Wenn Sie kleine einfache Jobs haben, ist es wahrscheinlicher, dass diese Probleme mit @parallel keine Probleme verursachen. Für größere oder komplexere Aufgaben hat pmap Vorteile.