我正在使用parallel
软件包来尝试优化某种算法以节省计算时间(我有8核处理器)。
线性解决方案大约需要18秒,但是由于我已经运行了很多次,因此我们假设它值得优化。而且,该算法可以简化为5个相似任务的描述,因此适合并行化。
不幸的是,并行解决方案与线性解决方案花费的时间相同。
在日志中,我发现5个任务从4.6到4.8秒耗时,因此我不明白为什么并行解决方案如此之慢。
这是并行化算法的代码(对不起,很难提供reprex):
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的一些答案都在讨论开销(here),但通常会说,如果任务是几秒钟(就是这样),那应该不成问题。
如果减速确实与开销有关,那么如何减少开销呢?否则,我在做什么错了?