我正在尝试弄清楚如何使用并行处理。为此,我创建了一个测试速度的函数。但是,当我使用 4 核而不是 1 核时,我只能获得双倍速度,这是为什么?
示例代码:
as <- runif(30) # limit for
bs <- runif(30)
cs <- runif(30) # distribution of food sources ('random'/'clustered')
p_space <- list ()
for (a in as){
for (b in bs){
for (c in cs){
p_space[[length(p_space)+1]] <- c(a,b,c)
}
}
}
made_up <- function(pvec){
a <- pvec[1]
b <- pvec[2]
c <- pvec[3]
for(i in 1:10000){
d <- a*b*c
}
return(list(a,b,c,d))
}
system.time({
z <- lapply(p_space,made_up)
results1 <- data.frame(matrix(unlist(z),ncol = 4, byrow = T))
colnames(results1) <- c('a','b','c','product')
})
user system elapsed
21.23 0.01 21.26
library(parallel)
no_cores <- detectCores()
cl <- makeCluster(no_cores)
clusterExport(cl, c("p_space"))
# clusterEvalQ() #for libraries on all nodes
system.time ({
z <- parLapply(cl, p_space, made_up)
results <- data.frame(matrix(unlist(z),ncol = 4, byrow = T))
colnames(results) <- c('a','b','c','product')
})
user system elapsed
0.02 0.02 10.86
注意,我检查过,它创建的集群中有 4 个核心,并且它们都在运行(并行时 CPU 性能 = 100%,非并行时为 25%)
最佳答案
您的系统很可能有两个支持超线程的物理核心,看起来就像四个核心。您可以通过比较这些命令的输出来测试这一点:
detectCores(logical = FALSE)
#> 2
detectCores()
#> 4
以上值来 self 的系统,其性能结果与您的系统类似。但仅使用两个物理核心可提供与使用四个逻辑核心相同的性能。类比:您有两个可以为人们提供服务的柜台,每个柜台都有两个可能的队列。如果所有的人都被送到一个队列,看起来只使用了 25% 的容量。如果它们被发送到所有四个队列,看起来就像 100% 被使用。但是,只有两个柜台开放,因此从两个队列变为四个队列(几乎)没有任何好处。
关于r - 为什么并行处理没有加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48935080/