1

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)!

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

4

0 回答 0