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
我无法弄清楚为什么多核比单核更慢。是因为计算成本不是很高吗?
答案 0 :(得分:4)
当您对代码进行并行化时,您总会得到一些开销。由于此处的工作量非常简单,因此开销大于工作负载。如果您使用需要一些时间的工作负载,例如Sys.sleep(0.1)
,您应该看到由于多核计算而加速。