почему допар не сокращает время? - PullRequest
0 голосов
/ 01 мая 2020

Я использовал пример отсюда https://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf

library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
system.time(foreach(i=1:10000) %do% sqrt(i))
stopCluster(cl)

Это мой вывод

Loading required package: foreach
Loading required package: iterators
Loading required package: parallel

> system.time(foreach(i=1:10000) %dopar% sqrt(i))
   user  system elapsed
  6.307   0.537   7.499
> system.time(foreach(i=1:10000) %do% sqrt(i))
   user  system elapsed
  4.581   0.035   4.622

Почему синхронизация не уменьшается с допаром?

1 Ответ

1 голос
/ 01 мая 2020

Я теряю скорость. Вы должны помнить, что при выполнении параллельных вычислений возникают дополнительные затраты:

2 узла:

library(doParallel)
cl <- makeCluster(2)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
#   user  system elapsed 
#   1.71    0.26    2.13 
system.time(foreach(i=1:10000) %do% sqrt(i))
#   user  system elapsed 
#   1.36    0.00    1.36 
stopCluster(cl)

12 узлов:

cl <- makeCluster(12)
registerDoParallel(cl)
system.time(foreach(i=1:10000) %dopar% sqrt(i))
#   user  system elapsed 
#   1.92    0.14    2.09 
system.time(foreach(i=1:10000) %do% sqrt(i))
#   user  system elapsed 
#   1.28    0.00    1.28 
stopCluster(cl)

Для такой простой функции вы не можете ожидать, что время на go уменьшится на коэффициент, соответствующий количеству узлов.

Сравните с:

heavy_computation <- function(i) {
  Sys.sleep(0.1)
  1 + i
}

cl <- makeCluster(12)
registerDoParallel(cl)
system.time(foreach(i=1:100) %dopar% heavy_computation(i))
#   user  system elapsed 
#   0.03    0.00    0.95 
system.time(foreach(i=1:100) %do% heavy_computation(i))
#   user  system elapsed 
#   0.00    0.00   10.28 
stopCluster(cl)
...