在相当大的数据集上使用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)!
由于这些影响取决于处理器架构,是否有任何缓存问题或内存复制问题可以解释这些糟糕的性能?有什么建议吗?