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

Respuestas a la pregunta(1)

Su respuesta a la pregunta