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 の場合は、はるかに効率的です (1.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 を使用) !
これらの影響はプロセッサのアーキテクチャに依存するため、これらのパフォーマンスの低下を説明できるキャッシュの問題やメモリのコピーの問題はありますか? 助言がありますか?