【问题标题】:Why does parallel processing not speed this up more?为什么并行处理不能加快速度?
【发布时间】:2018-02-23 03:15:12
【问题描述】:

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

【问题讨论】:

  • 我完全不明白为什么你认为你应该通过双倍的核心数获得不止一倍的速度。
  • 核心数是 4 倍(我刚刚看到我的错字)

标签: r optimization parallel-processing


【解决方案1】:

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

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

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

【讨论】:

  • 啊,我明白了!我不知道。那么为什么 CPU 的使用率会从 25% 增加到 100% 呢?
  • @DomBurns 您的操作系统只是从外部查看,即我在上面添加的类比中的“填充了多少队列”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多