如何在群集上组合doMPI和doMC?

时间:2016-02-18 15:09:56

标签: r foreach parallel-processing mpi multicore

我习惯于使用ArrayList<MyObject> mylist = new ArrayList<MyObject>(); mylist.FetchFromDb(); doMC进行并行计算,现在我已经可以访问群集了。我的问题与此Going from multi-core to multi-node in R类似,但此帖没有回复。

基本上我可以向我的批处理排队系统请求许多任务foreach和每个任务-n的多个核心。我设法使用-c对我请求的任务数进行并行模拟,但我现在想使用doMPI的{​​{1}}选项来使每个MPI进程使用多核功能。

我注意到的一点是maxcores似乎没有看到我被归因的内核数量并返回节点的最大核心数。

现在我试过了:

startMPIcluster

parallel::detectCores()内部确实有一些ncore = 3 #same number as the one I put with -c option library(Rmpi) library(doMPI) cl <- startMPIcluster(maxcores = ncore) registerDoMPI(cl) ## now some parallel simulations foreach(icount(10), .packages = c('foreach', 'iterators', 'doParallel')) %dopar% { ## here I'd like to use the `ncore` cores on each simulation of `myfun()` registerDoParallel(cores = ncore) myfun() } 循环但是如果我设置了myfun那么我就会收到错误:

  

{:任务1失败 - &#34;&#39; mckill&#39;失败&#34;

感谢

修改

我可以访问的机器是http://www-ccrt.cea.fr/fr/moyen_de_calcul/airain.htm,其中指定了#34; Librairies MPI:BullxMPI,分销Bull MPI优化并与OpenMPI兼容&#34;

1 个答案:

答案 0 :(得分:2)

您正在尝试同时使用许多不同的概念。您正在使用基于MPI的群集在不同的计算机上启动,但正在尝试同时使用多核处理。这使事情变得不必要地复杂化。

您正在使用的群集可能分散在多个节点上。如果要进行并行处理,则需要某种方式在这些节点之间传输数据。

来自 MPI 。这是一种在不同机器上轻松连接不同工作人员的方法,无需指定IP地址或端口。这就是为什么要使用mpirunccc_mprun启动流程的原因(这可能是一个带有特定群集的额外参数的脚本)。

我们现在如何在R中使用此系统?(另请参阅https://cran.r-project.org/web/packages/doMPI/vignettes/doMPI.pdf

使用:mpirun -n 24 R --slave -f myScriptMPI.R启动脚本,以启动24个工作进程。集群管理系统将决定启动这些工作进程的位置。它可以在同一台(强大的)机器上启动所有24台机器,也可以将它们分布在24台不同的机器上。这取决于工作负载,可用资源,可用内存,当前处于休眠模式的计算机等等。

以上命令将在24台不同的计算机上启动myScriptMPI.R。我们现在如何合作?

library(doMPI)
cl <- startMPIcluster() 
#the "master" process will continue
#the "worker" processes will wait here until receiving work from the master
registerDoMPI(cl)
## now some parallel simulations
foreach(icount(24), .packages = c('foreach', 'iterators'), .export='myfun') %dopar% {
    myfun()
}

您的数据将使用MPI协议自动从主设备传输到工作人员。

如果你想要更多地控制你的分配,包括为多核和节点间并行化制作“嵌套”MPI集群,我建议你阅读doMPI插图。