2016-07-08 11 views
0

Das folgende Stück Code soll sehr einfach zu laufen sein. Im sequentiellen Modus wird es in weniger als einer Sekunde ausgeführt. Wenn ich es parallel mache, dauert es scheinbar ewig. Wenn ich die Vektorlängen auf 100 setze, läuft der Code gut, also glaube ich nicht, dass es ein strukturelles Problem ist.Warum dauert die Parallelisierung des folgenden Codes zu viel?

library(foreach) 
    library(doParallel) 
    cl <- makeCluster(4) 
    registerDoParallel(cl) 
    bvec <-as.vector(1:1e3) 
    avec <-as.vector(1:1e3) 
    sim= function(x,y) 10*x+y 
    system.time(x <- 
     foreach(b=bvec, .combine='cbind') %:% 
     foreach(a=avec, .combine='c') %dopar% { 
     sim(a, b) 
     }) 

Was ist der Haken? geschätzt.

+0

Könnten Sie bitte ein wenig ausarbeiten? – Theoden

+0

Stellen Sie sich vor, Sie haben keinen Computer und Sie müssen eine Berechnung durchführen. Du schickst 3 Freunde Briefe, in denen sie gebeten werden, Teile der Berechnung zu machen, sie machen sie und schicken dir die Ergebnisse zurück und du fügst alles zusammen. Wenn jede Rechenaufgabe sehr lange dauert, ist dies effizient, auch wenn Sie auf die Post warten müssen. Wenn jedoch jede Berechnung sehr einfach ist, wäre es schneller, sich selbst zu tun. – Gregor

+0

Zum Beispiel, wenn jede Berechnung 1 Monat zu tun braucht, würde es 4 Monate dauern, aber sogar 4 Tage auf die Mail warten, 1 Monat + 4 Tage mit deinen Freunden - viel effizienter. Wenn jedoch jede Berechnung 1 Stunde dauert, können Sie dies in 4 Stunden selbst oder in 4 Tagen + 1 Stunde mit Ihren Freunden tun. Warten auf die Post verlangsamt Sie nur. – Gregor

Antwort

1

Parallelität erfordert ziemlich viel Overhead. Da Ihre "Sim" -Funktion rechnerisch billig ist, überfordern die Kosten des Overheads die Leistungsvorteile durch die parallele Ausführung von 'sim'. Deshalb erhalten Sie die erwarteten Ergebnisse mit größeren Vektorlängen.