Testuję funkcję parLapplyLB()
, aby zrozumieć, co robi, aby zrównoważyć obciążenie. Ale nie widzę żadnej równowagi. Na przykład,Dlaczego parLapplyLB tak naprawdę nie równoważą obciążenia?
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)
Jeśli to było naprawdę równoważenie obciążenia, pierwszej pracy (Job 1), który śpi na 3 sekundy będzie na pierwszym węźle i pozostałych trzech miejsc pracy (Praca 2: 4) będzie spać w sumie 1,5 sekundy na drugim węźle. Łącznie czas systemowy powinien wynosić tylko 3 sekundy.
Zamiast tego, myślę, że zadania 1 i 2 są przydzielane węzłowi 1, a zadania 3 i 4 są przydzielane węzłowi 2. W rezultacie całkowity czas wynosi 3 + 0,5 = 3,5 sekundy. Jeśli uruchomimy ten sam kod powyżej z parLapply()
zamiast parLapplyLB()
, otrzymamy ten sam czas systemowy około 3,5 sekundy.
Czego nie rozumiem lub nie robię źle?
Myślę, że R nie wykonuje automatycznego równoważenia obciążenia. Myślę, że dzieli on * zadania * na tak wiele rdzeni, jakie są dostępne, niezależnie od czasu potrzebnego na wykonanie każdego zadania lub zakończenia każdego zadania. To nie jest kolejka zadań, a kiedy jeden robotnik skończył, chwyta następny. Każdemu rdzeniu przypisano dwa zadania. Stąd 3 + 0,5 na pierwszego pracownika, a łącznie 3,5. * byłby szczęśliwy, gdyby się mylił * – gregmacfarlane
Tak, to stąd pochodzi 3.5. To nie równoważenie obciążenia. Ale parLapplyLB twierdzi, że balansuje. – josiekre