我习惯于使用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;
答案 0 :(得分:2)
您正在尝试同时使用许多不同的概念。您正在使用基于MPI的群集在不同的计算机上启动,但正在尝试同时使用多核处理。这使事情变得不必要地复杂化。
您正在使用的群集可能分散在多个节点上。如果要进行并行处理,则需要某种方式在这些节点之间传输数据。
来自 MPI 。这是一种在不同机器上轻松连接不同工作人员的方法,无需指定IP地址或端口。这就是为什么要使用mpirun
或ccc_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插图。