Я пытался повысить эффективность своего кода, используя параллельный цикл foreach
из библиотеки doParralel
.Однако я обнаружил, что для завершения параллельного кода требуется значительно больше времени.Мне удалось сузить проблему до линий, оптимизирующих (nloptr
) функцию, включающую инверсию матрицы.Может ли кто-нибудь помочь мне выяснить, почему я получаю следующие результаты?Это точный сценарий, который я использую для воспроизведения проблемы
library(doParallel)
if (!exists('cluster')) {
cl <<- makeCluster(2)
registerDoParallel(cl)
}
pt <- function(n,t,m,par=TRUE) {
if (par)
foreach(1:t) %dopar% {
for(i in 1:m)
solve(matrix(runif(n*n),n,n))
NULL
}
else
foreach(1:t) %do% {
for(i in 1:m)
solve(matrix(runif(n*n),n,n))
NULL
}
}
Затем,
> system.time(pt(200,6,10,FALSE))
user system elapsed
0.904 1.667 0.330
> system.time(pt(200,6,10,TRUE))
user system elapsed
0.133 0.012 33.918
Меньшее время пользователя - отлично.Но почему невероятно высокое общее прошедшее время?
> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.4 LTS
locale:
[1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
[3] LC_TIME=pl_PL.UTF-8 LC_COLLATE=en_GB.UTF-8
[5] LC_MONETARY=pl_PL.UTF-8 LC_MESSAGES=en_GB.UTF-8
[7] LC_PAPER=pl_PL.UTF-8 LC_NAME=pl_PL.UTF-8
[9] LC_ADDRESS=pl_PL.UTF-8 LC_TELEPHONE=pl_PL.UTF-8
[11] LC_MEASUREMENT=pl_PL.UTF-8 LC_IDENTIFICATION=pl_PL.UTF-8
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] doParallel_1.0.11 iterators_1.0.9 foreach_1.4.4 rkward_0.6.3
loaded via a namespace (and not attached):
[1] tools_3.2.3 codetools_0.2-14