mclapply
在相当大的数据集上使用 R 函数时,我遇到了性能开销。例如,让我们考虑以下玩具示例(它包括对子矩阵的元素进行并行求和):
n = 30000
X = matrix(rnorm(155*n),155,n)
sum.submatrix.rowwise <- function(i){
chunks = split(1:155, ceiling(seq_along(1:155)/(155/4)))
return(sum(X[chunks[[i]],]))
}
sum.submatrix.colwise <- function(i){
chunks = split(1:n, ceiling(seq_along(1:n)/(n/4)))
return(sum(X[,chunks[[i]]]))
}
在我的四核 Intel Xeon W3550 上,如果子矩阵是逐行的,并行方法显然效率不高(加速 x0.8!):
system.time( for(i in 1:4) sum.submatrix.rowwise(i) )
# elapsed 0.073
system.time( mclapply(1:4, FUN=function(i) sum.submatrix.rowwise(i), mc.cores=4) )
# elapsed 0.094
但如果子矩阵是 colwise 则效率更高(加速 x1.8,仍然不完美):
system.time( for(i in 1:4) sum.submatrix.colwise(i) )
# elapsed 0.175
system.time( mclapply(1:4, FUN=function(i) sum.submatrix.rowwise(i), mc.cores=4) )
# elapsed 0.095
与此同时,我在 12 核 AMD Opteron 6174 上做了同样的实验,加速分别是 x1.8 和 x3.9(仍然是 mc.cores=4)!
由于这些影响取决于处理器架构,是否有任何缓存问题或内存复制问题可以解释这些糟糕的性能?有什么建议么?