为什么这种 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)
,您应该会看到多核计算带来的加速。
两个矩阵
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)
,您应该会看到多核计算带来的加速。