R函数mclapply的性能开销

时间:2016-02-09 16:22:52

标签: r performance parallel-processing multicore mclapply

在相当大的数据集上使用R函数mclapply时,我遇到了性能开销。例如,让我们考虑下面的玩具示例(它包括并行地对子矩阵的元素求和):

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]]]))
}

在我的四核英特尔至强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)!

由于这些影响取决于处理器架构,是否有任何缓存问题或内存复制问题可以解释这些糟糕的性能?有什么建议吗?

0 个答案:

没有答案