Estoy jugando con la paralelización en R por primera vez. Como primer ejemplo de juguete, probé¿Por qué foreach()% do% a veces es más lento que para?
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)
}
Sé que sqrt()
ejecuta demasiado rápido para parallellization a la materia, pero lo que no esperaba era que foreach() %do%
sería más lento que 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
En la mayoría de los ejemplos que he visto, foreach() %dopar%
se compara con foreach() %do%
en lugar de for()
. Dado que foreach() %do%
fue mucho más lento que for()
en mi ejemplo de juguete, ahora estoy un poco confundido. De alguna manera, pensé que estas eran formas equivalentes de construir for-loops. ¿Cuál es la diferencia? ¿Alguna vez son equivalentes? ¿Es foreach() %do%
siempre más lento?
Actualización: Después de multas @Peter responden, puedo actualizar myFunc
de la siguiente manera:
a<-rep(NA,B)
myFunc<-function()
{
for(i in 1:B) a[i]<-sqrt(i)
}
Esto hace for()
un poco más lento, pero no mucho:
> system.time(myFunc())
user system elapsed
0.036 0.000 0.035
> system.time(myFunc2())
user system elapsed
6.380 0.000 6.385
Consulte también esta pregunta: http://stackoverflow.com/questions/5007458/problems-using-foreach-parallelization y este: http: // stackoverflow.com/questions/5012804/mpi-parallelization-using-snow-is-slow – Charlie
Gracias @Charlie, ¡las respuestas a esas preguntas fueron muy útiles para lo que estoy intentando hacer después de que termine con mi ejemplo de juguete! :) Todavía no estoy seguro de entender por qué 'foreach' necesita mucho más tiempo cuando se usa la opción'% do% '. –
Una gran parte de esto es que% do% tiene que parcelar las piezas/asignaciones, enviarlas a los procesadores, luego volver a unirlas al final según corresponda. Estos pasos requieren tiempo de organización que no tiene la versión sin paralelo. – Charlie