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 の場合は、はるかに効率的です (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 を使用) !

これらの影響はプロセッサのアーキテクチャに依存するため、これらのパフォーマンスの低下を説明できるキャッシュの問題やメモリのコピーの問題はありますか? 助言がありますか?

4

0 に答える 0