Paralelización en R:% dopar% vs% do%. ¿Por qué usar un solo núcleo rinde para un mejor rendimiento?
Estoy experimentando un comportamiento extraño en mi computadora cuando distribuyo procesos entre sus núcleos utilizando doMC y foreach. ¿Alguien sabe por qué utilizando un solo núcleo obtengo un mejor rendimiento que usando dos núcleos? Como puede ver, el procesamiento del mismo código sin registrar ningún núcleo (que supuestamente usa solo 1 núcleo) produce un procesamiento mucho más eficiente en el tiempo. Mientras que% do% parece funcionar mejor que% dopar%, registrar 2 núcleos de 4 produce más tiempo.
require(foreach)
require(doMC)
# 1-core
> system.time(m <- foreach(i=1:100) %dopar%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.285 1.895 11.083
> system.time(m <- foreach(i=1:100) %do%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.139 1.879 10.979
# 2-core
> registerDoMC(cores=2)
> system.time(m <- foreach(i=1:100) %dopar%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
3.322 3.737 132.027
> system.time(m <- foreach(i=1:100) %do%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.744 2.054 11.740
El uso de 4 núcleos en pocos ensayos produce resultados muy diferentes:
> registerDoMC(cores=4)
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
11.522 4.082 24.444
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
21.388 6.299 25.437
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
17.439 5.250 9.300
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
17.480 5.264 9.170