我的 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"
知道这里会发生什么吗?感谢您在我尝试这些并行化选项时提供的帮助。
亲切地,
查理
最佳答案
这与您的其他问题有点相同:集群中节点之间的通信比实际功能占用的时间更多。
这可以通过更改您的功能来说明:
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 次循环,另一种是 1 毫秒计算和 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 集群,但这基本上是相同的故事。根据通信所需的时间,不同类型的集群之间存在细微的差异,部分原因是底层包之间的差异。
关于r - 使用 SNOW 的 MPI 并行化速度很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5012804/