我想弄清楚如何使用并行处理。为此,我做了一个测试速度的功能。但是,当使用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
N.B我检查了它所创建的集群中有4个核心,它们都在运行(cpu性能=并行100%,而不是25%)
答案 0 :(得分:3)
您的系统很可能有两个支持超线程的物理内核,看起来像四个内核。您可以通过比较这些命令的输出来测试它:
detectCores(logical = FALSE)
#> 2
detectCores()
#> 4
上述值来自我的系统,可为您提供类似的性能结果。但是,仅使用两个物理内核可以提供与使用四个逻辑内核相同的性能。打个比方:你有两个柜台供人们服务,每个柜台都有两个可能的队列。如果所有人都被发送到一个队列,则看起来只有25%的容量被使用。如果将它们发送到所有四个队列,则看起来使用100%。但是,只有两个计数器打开,因此从两个队列到四个队列几乎没有任何收益。