【发布时间】:2020-04-09 06:49:01
【问题描述】:
玩弄 R 函数parallel::mclapply,我发现参数mc.cores 可以选择大于逻辑核心的数量(如parallel::detectCores 所示),从而导致加速大于逻辑核心的数量。这是一个最小的例子(对我来说,这适用于 MacOS 和 Linux):
sleepy <- function(i) {
start <- Sys.time()
Sys.sleep(i)
as.numeric(Sys.time() - start)
}
mc.cores <- 100L
ntasks <- 10000L
start <- Sys.time()
out <- parallel::mclapply(2/ntasks*runif(ntasks), sleepy, mc.cores = mc.cores)
real_duration <- as.numeric(Sys.time() - start)
cpu_duration <- sum(unlist(out))
data.frame(logical.cores = parallel::detectCores(),
mc.cores = mc.cores,
speedup = cpu_duration/real_duration)
## logical.cores mc.cores speedup
## 1 8 100 30.49574
我还在一个更现实的例子中进行了尝试,即接近我想要并行化的真实场景:这也没有导致任何问题。
在parallel::mclapply 的/tutorials 文档中,我找不到任何选择mc.cores > detectCores() 的示例,而且很可能有一个很好的理由。
有人能解释一下这种做法有什么问题吗?在某些情况下是否合理,例如当内存要求不是问题时?
【问题讨论】:
-
什么是
parallel::detectCores(logical = FALSE)?
标签: r parallel-processing mclapply