Io gioco per la prima volta con la parallellizzazione in R. Come primo esempio giocattolo, ho provatoPerché foreach()% do% a volte è più lento di?
library(doMC)
registerDoMC()
B<-10000
myFunc<-function()
{
for(i in 1:B) sqrt(i)
}
myFunc2<-function()
{
foreach(i = 1:B) %do% sqrt(i)
}
myParFunc<-function()
{
foreach(i = 1:B) %dopar% sqrt(i)
}
so che sqrt()
esegue troppo veloce per parallellization alla materia, ma quello che non mi aspettavo era che foreach() %do%
sarebbe più lento di for()
:
> system.time(myFunc())
user system elapsed
0.004 0.000 0.005
> system.time(myFunc2())
user system elapsed
6.756 0.000 6.759
> system.time(myParFunc())
user system elapsed
6.140 0.524 6.096
Nella maggior parte degli esempi che ho visto, lo foreach() %dopar%
viene confrontato con lo foreach() %do%
anziché con lo for()
. Dal foreach() %do%
era molto più lento di for()
nell'esempio del mio giocattolo, ora sono un po 'confuso. In qualche modo, pensavo che questi fossero modi equivalenti per costruire for-loops. Qual è la differenza? Sono mai equivalenti? foreach() %do%
è sempre più lento?
UPDATE: seguenti ammende @Peter rispondere, aggiorno myFunc
come segue:
a<-rep(NA,B)
myFunc<-function()
{
for(i in 1:B) a[i]<-sqrt(i)
}
Questo rende for()
un po 'più lento, ma non di molto:
> system.time(myFunc())
user system elapsed
0.036 0.000 0.035
> system.time(myFunc2())
user system elapsed
6.380 0.000 6.385
Vedere anche questa domanda: http://stackoverflow.com/questions/5007458/problems-using-foreach-parallelization e questo: http: // stackoverflow.it/questions/5012804/mpi-parallelization-using-snow-is-slow – Charlie
Grazie a @Charlie, le risposte a queste domande sono state molto utili a quello che sto cercando di fare dopo aver finito con il mio esempio di giocattolo! :) Non sono ancora sicuro di aver capito perché 'foreach' ha bisogno di molto più tempo quando si usa l'opzione'% do% '. –
Gran parte di questo è che% do% deve suddividere i pezzi/assegnazioni, inviarli ai processori, quindi riunire tutto alla fine, a seconda dei casi. Questi passaggi richiedono tempi organizzativi che la versione non parallela non ha. – Charlie