Sto testando la funzione parLapplyLB()
per capire cosa fa per bilanciare un carico. Ma non vedo alcun evento di bilanciamento. Ad esempio,Perché parLapplyLB non bilancia effettivamente il carico?
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)
Se è stato veramente il bilanciamento del carico, il primo lavoro (job 1) che dorme per 3 secondi sarebbe sul primo nodo e gli altri tre posti di lavoro (posti di lavoro 2: 4) sarebbe dormire per un totale di 1,5 secondi sull'altro nodo. In totale, il tempo di sistema dovrebbe essere solo 3 secondi.
Invece, penso che i lavori 1 e 2 siano assegnati al nodo 1 e i lavori 3 e 4 siano assegnati al nodo 2. Ne risulta che il tempo totale è 3 + 0,5 = 3,5 secondi. Se eseguiamo lo stesso codice sopra con parLapply()
anziché parLapplyLB()
, otteniamo lo stesso tempo di sistema di circa 3,5 secondi.
Cosa non sto capendo o storto?
Penso che R non esegua il bilanciamento automatico del carico. Penso che divida le * attività * su tutti i core disponibili, indipendentemente dal tempo necessario per eseguire ogni attività o quando ogni attività viene completata. Non è come se ci fosse una coda di compiti, e quando un lavoratore ha finito, afferra il prossimo. A ciascun core sono stati assegnati due compiti. Quindi 3 + 0,5 sul primo operatore e un totale di 3,5. * Sarebbe felice di sbagliare * – gregmacfarlane
Sì, ecco da dove viene il 3.5. Non sta equilibrando il carico. Ma la parLapplyLB afferma di bilanciare. – josiekre