Сокращение накладных расходов при выполнении параллельной задачи в R
Я использую parallel
пакет, чтобы попытаться оптимизировать некоторый алгоритм для экономии вычислительного времени (у меня 8-ядерный процессор).
Линейное решение занимает около 18 секунд, но, поскольку я запускаю его много раз, давайте предположим, что его стоит оптимизировать. Более того, алгоритм может быть упрощен до отклонения от 5 похожих задач, поэтому он пригоден для распараллеливания.
К сожалению, параллельное решение занимает то же время, что и линейное.
Копаясь в журнале, я увидел, что 5 задач заняли от 4,6 до 4,8 секунды, поэтому я не понимаю, почему параллельное решение так медленно.
Вот код для алгоритма распараллеливания (извините, представление было бы очень трудно обеспечить):
library(parallel)
library(tidyverse)
library(tictoc)
myFunction=function(arg, as.num){
tic(arg)
rtn = ... #some computing
toc() #print around 4.5 secs, whatever the task
return(rtn)
}
tic("parallel")
parallel.clusters = makeCluster(detectCores() - 1, outfile="parallel.log.txt")
clusterEvalQ(parallel.clusters, library(survival)) %>% invisible
clusterExport(parallel.clusters, c("printZphProblem", "rownames_to_column",
"%>%", "rcs", "tic", "toc", "extract2",
"filter"))
x=parSapply(parallel.clusters,
X=list(q = list(arg="q", as.num=F),
med = list(arg="num", as.num=F),
trend = list(arg="q", as.num=T),
cont = list(arg="cont", as.num=F),
cont.std = list(arg="cont.std", as.num=F)),
FUN=function(x){myFunction(x$arg, x$as.num)},
simplify=F)
stopCluster(parallel.clusters)
toc()
# parallel: 18.42 sec elapsed
В некоторых ответах по SO говорится о накладных расходах ( здесь), но обычно говорится, что если задача состоит из нескольких секунд (что она есть), это не должно быть проблемой.
Если замедление действительно связано с накладными расходами, как я могу уменьшить его? Иначе, что я делаю не так?