为什么并行处理不会加快速度?

时间:2018-02-22 18:47:36

标签: r optimization parallel-processing

我想弄清楚如何使用并行处理。为此,我做了一个测试速度的功能。但是,当使用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%)

1 个答案:

答案 0 :(得分:3)

您的系统很可能有两个支持超线程的物理内核,看起来像四个内核。您可以通过比较这些命令的输出来测试它:

detectCores(logical = FALSE) 
#> 2    
detectCores() 
#> 4

上述值来自我的系统,可为您提供类似的性能结果。但是,仅使用两个物理内核可以提供与使用四个逻辑内核相同的性能。打个比方:你有两个柜台供人们服务,每个柜台都有两个可能的队列。如果所有人都被发送到一个队列,则看起来只有25%的容量被使用。如果将它们发送到所有四个队列,则看起来使用100%。但是,只有两个计数器打开,因此从两个队列到四个队列几乎没有任何收益。