doMPI和用户定义的软件包

时间:2018-10-01 11:19:21

标签: r foreach parallel-processing dompi

我开始使用doMPI,并且使用的是我自己定义的软件包。

首先,我的文件中有待执行的文件:

library(doMPI)
cl <- startMPIcluster() 
registerDoMPI(cl)

注意:我不使用cl <- startMPIcluster(count),因为我认为最好在函数之外指定内核数,但是我不清楚[{1}}是否正确还是不行。

然后,通过cl <- startMPIcluster()加载我的包后

library(my_package)

使用myres <- foreach(t2 = 1550:1551) %dopar% {my_function(t2)} 导致

  

评估错误:找不到函数“ my_function”

但是功能mpirun在群集中被识别:当我在没有my_function的情况下运行my_function时,结果是正确的。

然后,我将呼叫更改为:

MPI

,然后它开始运行,因此添加myres <- foreach(t2 = 1550:1551) %dopar% {my_package::my_function(t2)} 使my_package::了解mpirun是什么。奇怪的是,因为我已经运行过library(my_package)。

但是在开始运行后,还有另一个错误:

  

“评估错误:找不到函数“ my_function_2”。”

my_function是我的程序包中定义的函数。

当然,一种可能性是进入我程序包中的所有函数,并且当调用另一个函数时,只需添加my_function_2

但是我认为这不是应该的,所以我想我有一个看不见的潜在错误/错误使用指令。

关于可能出什么问题的任何想法?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

您应该使用foreach .packages选项初始化工作进程:

myres <-
  foreach(t2=1550:1551, .packages='my_package') %dopar% {
    my_function(t2)
  }

这将导致每个集群工作程序加载my_package。在主进程中加载​​程序包不会导致集群工作人员加载该程序包,这就是为什么.packages是必需的。

对于startMPIcluster,除非我在没有count的情况下执行R脚本(这限制了您在单个节点上运行),否则我永远不会使用mpirun参数。如果未指定count,则startMPIcluster从mpirun获取所有信息,从而使脚本更加灵活。