我的foray into parallelization继续。我最初安装Rmpi
时遇到了困难,但我明白了(我需要sudo apt-get
)。我应该说我正在使用Ubuntu 10.10运行一台机器。
我运行了与previous question相同的模拟。分别回顾unclustered和SNOW
SOCK集群的系统时间:
> system.time(CltSim(nSims=10000, size=100))
user system elapsed
0.476 0.008 0.484
> system.time(ParCltSim(cluster=cl, nSims=10000, size=100))
user system elapsed
0.028 0.004 0.375
现在,使用MPI群集,相对于未群集,我获得了减速的速度:
> stopCluster(cl)
> cl <- getMPIcluster()
> system.time(ParCltSim(cluster=cl, nSims=10000, size=100))
user system elapsed
0.088 0.196 0.604
不确定这是否有用,但此处有关创建的群集的信息:
> cl
[[1]]
$rank
[1] 1
$RECVTAG
[1] 33
$SENDTAG
[1] 22
$comm
[1] 1
attr(,"class")
[1] "MPInode"
[[2]]
$rank
[1] 2
$RECVTAG
[1] 33
$SENDTAG
[1] 22
$comm
[1] 1
attr(,"class")
[1] "MPInode"
attr(,"class")
[1] "spawnedMPIcluster" "MPIcluster" "cluster"
关于这里可能会发生什么的任何想法?感谢您在尝试这些并行化选项时提供的帮助。
亲切, 查理
答案 0 :(得分:3)
它与您的另一个问题有点相似:群集中节点之间的通信比实际功能占用更多时间。
这可以通过更改您的功能来说明:
library(snow)
cl <- makeCluster(2)
SnowSim <- function(cluster, nSims=10,n){
parSapply(cluster, 1:nSims, function(x){
Sys.sleep(n)
x
})
}
library(foreach)
library(doSNOW)
registerDoSNOW(cl)
ForSim <- function(nSims=10,n) {
foreach(i=1:nSims, .combine=c) %dopar% {
Sys.sleep(n)
i
}
}
这样我们就可以在不同数量的模拟中模拟长计算和短计算功能。我们来看两种情况,一种是你有1秒计算和10循环,一种是1ms计算和10000循环。两者都应该持续10秒:
> system.time(SnowSim(cl,10,1))
user system elapsed
0 0 5
> system.time(ForSim(10,1))
user system elapsed
0.03 0.00 5.03
> system.time(SnowSim(cl,10000,0.001))
user system elapsed
0.02 0.00 9.78
> system.time(ForSim(10000,0.001))
user system elapsed
10.04 0.00 19.81
基本上你看到的是,对于长计算功能和低模拟,并行化版本将计算时间干净地按预期减少了一半。
现在你做的模拟是第二种情况。在那里,您看到snow
解决方案不再真正有所作为,foreach
解决方案甚至需要两倍的时间。这仅仅是由于节点之间和节点之间的通信开销以及返回的数据的处理。 foreach
的开销比snow
大很多,如我对上一个问题的回答所示。
我没有启动我的Ubuntu尝试使用MPI群集,但它基本上是相同的故事。根据沟通所需的时间,不同类型的集群之间存在细微差别,部分原因是底层软件包之间存在差异。