r - 为什么并行处理没有加快速度?

标签 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

注意,我检查过,它创建的集群中有 4 个核心,并且它们都在运行(并行时 CPU 性能 = 100%,非并行时为 25%)

最佳答案

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

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

以上值来 self 的系统,其性能结果与您的系统类似。但仅使用两个物理核心可提供与使用四个逻辑核心相同的性能。类比:您有两个可以为人们提供服务的柜台,每个柜台都有两个可能的队列。如果所有的人都被送到一个队列,看起来只使用了 25% 的容量。如果它们被发送到所有四个队列,看起来就像 100% 被使用。但是,只有两个柜台开放,因此从两个队列变为四个队列(几乎)没有任何好处。

关于r - 为什么并行处理没有加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48935080/

相关文章:

java - 我们可以加速 Java 中的 CPU 密集型任务吗?

任务的 Python 并行化(事件循环?)

python - 自定义指标的 Xgboost Early.stop.round 错误

r - 在组内计算值变化前后的值,为每个独特的转变生成新变量

arrays - 玩转matlab

java - java是否进行内部优化?

perl - 如何并行运行 Test::Perl::Critic?

传入函数后返回向量中的值

css - 使用 shinyWidgets 更改复选框的颜色

python - scipy 中的有界根查找