使用 type = MPI 的 "doParallel" 包和直接使用 doMPI 有什么区别?

What's the difference between using the "doParallel" package with type = MPI and using doMPI directly?

使用 type = MPI 的 "doParallel" 包和直接使用 doMPI 有什么区别?

library(foreach)
library(doParallel)
cl <- makeCluster(mpi.universe.size(), type='MPI')
registerDoParallel(cl)
system.time(foreach(i = 1:3) %dopar% {Sys.sleep(i); i})

VS

library(doMPI)
cl <- startMPIcluster(count=2)
registerDoMPI(cl)
system.time(foreach(i = 1:3) %dopar% {Sys.sleep(i); i})

"doParallel" 包作为 "clusterApplyLB" 函数的包装器,在使用 MPI 集群时通过调用 "Rmpi" 包中的函数来实现。

"doMPI" 包直接使用 "Rmpi" 函数,并包含一些 "clusterApplyLB" 中不可用的功能:

  • 支持动态获取输入和合并输出,以高效处理大量循环迭代;

  • 支持MPI广播初始化worker;

  • 允许通过 mpirun 或 MPI spawn 函数启动 worker。