为什么这种 R 计算在多核上较慢而在单核上较快?

Why is this R computation slower on multiple cores and faster on a single core?

两个矩阵

library(parallel)
m <- matrix(1:12000000000,  nrow=300000)
p <- matrix(21:32, nrow=3)

# Use all pairings of i and j
i_vec <- rep(seq_len(ncol(m)), times = ncol(m))
j_vec <- rep(seq_len(ncol(m)), each = ncol(m))

多核

system.time(mcmapply(i_vec, j_vec, 
   FUN = function(i, j) {
     if (i <= j) return(0)
     sqrt(sum(m[,i]) * sum(m[,j]) * sum(p[,i]) * sum(p[,j]))
   }, mc.cores=7))

单核

system.time(mapply(i_vec, j_vec, 
      FUN = function(i, j) {
      if (i <= j) return(0)
      sqrt(sum(as.numeric(m[,i])) * sum(as.numeric(m[,j])) * sum(as.numeric(p[,i])) * sum(as.numeric(p[,j])))
                 }))

运行 mcmapply 中有七个内核的计算结果

  user  system elapsed 
 0.014   0.485   0.019 

并且在 mapply 中有 1 个核心给出

 user  system elapsed 
0.008   0.000   0.008 

并为 mcmapply 指定 1 个内核会得到

 user  system elapsed 
0.007   0.000   0.007 

我不明白为什么多核比单核慢。是不是因为计算量不是很大?

并行化代码时,总会产生一些开销。对于这里非常简单的工作负载,开销大于工作负载。如果您使用需要一些时间的工作负载,例如Sys.sleep(0.1),您应该会看到多核计算带来的加速。