R函数mclappy的性能开销

R函数mclappy的性能开销,r,performance,parallel-processing,multicore,mclapply,R,Performance,Parallel Processing,Multicore,Mclapply,在相当大的数据集上使用R函数mclappy时,我遇到了性能开销。例如,让我们来考虑下面的玩具例子(它包含了并行的子矩阵的元素): 但如果子矩阵是按列排列的,则效率要高得多(加速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=

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

但如果子矩阵是按列排列的,则效率要高得多(加速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)


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

你的操作系统是什么
sessionInfo
?另外,我建议您使用一个更健壮的计时系统,使用多次运行,例如
microbenchmark
vs
system.time
您肯定是对的,实际上我一直使用
microbenchmark
,但出于空间原因(我的问题已经很长),我选择显示
system.time
的结果。总之,
microbenchmark
system.time
在我的问题上是一致的。基于英特尔的机器在Linux Ubuntu15.04和Rv3.1.2/AMD的机器在Debian Linux上,jessie和Rv3.1.1。我在Windows上,所以无法测试
mc.cores>1
。你看过包装了吗?你的操作系统是什么
sessionInfo
?另外,我建议您使用一个更健壮的计时系统,使用多次运行,例如
microbenchmark
vs
system.time
您肯定是对的,实际上我一直使用
microbenchmark
,但出于空间原因(我的问题已经很长),我选择显示
system.time
的结果。总之,
microbenchmark
system.time
在我的问题上是一致的。基于英特尔的机器在Linux Ubuntu15.04和Rv3.1.2/AMD的机器在Debian Linux上,jessie和Rv3.1.1。我在Windows上,所以无法测试
mc.cores>1
。你看过包装了吗?
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 
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