2013-01-07 3 views
8

Frageforeach% dopar% verwendet die sequentielle Worker-Einrichtung mit PSock-Cluster?

ich bemerkt habe, dass foreach /% dopar% sequenzielle führt, nicht parallel Setup einen Clusters vor den Aufgaben parallel ausführen. Wenn jeder Worker ein Dataset benötigt und N Sekunden dauert, um das Dataset an den Worker zu übertragen, gibt foreach /% dopar% #workers * N seconds von setup Zeit aus. Dies kann für große Mitarbeiter oder große N (große zu übertragende Datensätze) von Bedeutung sein.

Meine Frage ist, ob dies von Entwurf ist oder gibt es einige Parameter/Einstellungen, die ich foreach oder vielleicht Cluster-Generation fehlt?

Setup-

  • R 2.15.2
  • neuesten Versionen von foreach/parallel/doParallel ab heute (1/7/2013)
  • Windows 7 x64

Beispiel

library(foreach) 
library(parallel) 
library(doParallel) 

# lots of data 
data = eval(rnorm(100000000)) 

# make cluster/register - creates 6 nodes fairly quickly 
cluster = makePSOCKcluster(6 , outfile = "") 
registerDoParallel(cluster ) 

# fire up Task Manager. Observer that each node recieves data sequentially. 
# When last node gets data, then all nodes process at the same time 
results = foreach(i = 1 : 500) %dopar% 
{ 
    print(data[ i ]) 
    return(data[ i ]) 
} 
+0

Das "sequenzielle Setup" ist die einzige Art von Verhalten, die ich erlebt habe, ohne einen Shared-Memory-Cluster zu verwenden. Wenn es eine Möglichkeit gibt, dies ohne gemeinsamen Speicher zu beschleunigen, wäre ich auch sehr interessiert. Da 'clusterExport()' (über 'clusterCall()') sequentiell ausgeführt wird, glaube ich nicht, dass ich bis dahin den Atem anhalten werde. – BenBarnes

+0

Ben - Könnten Sie das näher erläutern? Und verzeihe meine Unwissenheit über Dinge, die mit OS/Gedächtnis zu tun haben ... In dem Beispiel gibt es 6 Kindprozesse und ich würde eine Gelegenheit sehen, Daten parallel an sie zu senden. Kann der Elternprozess nur sequenziell auf diese internen Daten zugreifen? – SFun28

+0

Dies grenzt an die Grenzen meines Wissens über Cluster-Kommunikation, aber auf Unix-ähnlichen Systemen kann man einen Prozess "forken", so dass untergeordnete Prozesse auf Objekte zugreifen können, die im übergeordneten Prozess geladen sind und nur diejenigen kopieren, die modifiziert wurden. Windows-Rechner verfügen nicht über diese spezielle Fähigkeit, und bei allen Clustertypen, die ich verwendet habe (was ** nicht ** alles ist), ist das Cluster-Setup sequenziell erfolgt. – BenBarnes

Antwort

3

Dank Rich bei Revolution Computing für mit diesem zu helfen ....

clusterCall verwendet eine for-Schleife jeden Arbeitnehmer, Daten zu senden. Da R nicht multi-threaded ist, muss die for-Schleife sequentiell sein.

Es gibt ein paar Lösungen (die jemanden erfordern würden, um sie zu kodieren). R könnte C/C++ aufrufen, um das Worker-Setup zu fädeln. Oder die Arbeiter könnten die Daten aus einer Datei auf der Festplatte ziehen. Oder die Arbeiter könnten an derselben Steckdose hören und der Meister könnte nur einmal in die Steckdose schreiben und die Daten an alle Arbeiter senden lassen.

+0

Danke für die Antwort! – BenBarnes