Ich teste die parLapplyLB()
Funktion aus, um zu verstehen, was es tut, um eine Last auszugleichen. Aber ich sehe keinen Ausgleich. Zum BeispielWarum gleicht parLapplyLB die Last nicht aus?
cl <- parallel::makeCluster(2)
system.time(
parallel::parLapplyLB(cl, 1:4, function(y) {
if (y == 1) {
Sys.sleep(3)
} else {
Sys.sleep(0.5)
}}))
## user system elapsed
## 0.004 0.009 3.511
parallel::stopCluster(cl)
Wenn es um die Last wirklich balancieren, den ersten Job (Job 1), die für 3 Sekunden schläft würde auf dem ersten Knoten und die anderen drei Arbeitsplätze (Arbeitsplätze 2: 4) würde schlafen für insgesamt 1,5 Sekunden auf dem anderen Knoten. Insgesamt sollte die Systemzeit nur 3 Sekunden betragen.
Stattdessen denke ich, dass Aufträge 1 und 2 an Knoten 1 und Aufträge 3 und 4 an Knoten 2 gegeben werden. Daraus ergibt sich die Gesamtzeit 3 + 0,5 = 3,5 Sekunden. Wenn wir den gleichen Code oben mit parLapply()
anstelle von parLapplyLB()
ausführen, erhalten wir die gleiche Systemzeit von etwa 3,5 Sekunden.
Was verstehe ich nicht oder mache ich falsch?
Ich denke, R tut nicht automatisch Lastausgleich. Ich denke, es verteilt die * Aufgaben * auf so viele Kerne wie verfügbar, unabhängig von der Zeit, die für jede Aufgabe benötigt wird, oder wenn jede Aufgabe abgeschlossen ist. Es ist nicht so, als gäbe es eine Warteschlange von Aufgaben, und wenn ein Arbeiter fertig ist, ergreift er den nächsten. Jedem Kern wurden zwei Aufgaben zugewiesen. Also 3 + 0,5 für den ersten Arbeiter und insgesamt 3,5. * würde glücklich sein, falsch zu sein * – gregmacfarlane
Ja, das ist, wo die 3.5 kommt. Es gleicht die Last nicht aus. Aber die parLapplyLB behauptet, auszugleichen. – josiekre