0

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

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

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

注意:我没有使用cl <- startMPIcluster(count),因为我认为最好指定函数“外部”的核心数量,但我不清楚这样做cl <- startMPIcluster()是否正确。

然后,通过加载我的包裹后library(my_package)

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

使用mpirun导致

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

但是该功能my_function在集群中被识别:当我没有运行时my_functionMPI结果是正确的。

然后,我将调用更改为:

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

然后它开始运行,所以添加my_package::允许mpirun了解是什么my_function。这很奇怪,因为我在 library(my_package) 之前运行过。

但是开始运行之后,又出现了一个错误:

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

my_function_2是我的包上定义的函数。

当然,一种可能性是转到我包中的所有函数,当调用另一个函数时,只需添加my_package::.

但我相信这不是应该的,所以我猜有一个我看不到的潜在错误/错误使用的指令。

关于可能发生什么问题的任何想法?先感谢您。

4

1 回答 1

0

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

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

这会导致每个集群工作人员加载my_package. 在主进程中加载​​包不会导致集群工作人员加载它,这就是.packages必要的原因。

至于startMPIcluster,我从不使用该count参数,除非我不执行 R 脚本mpirun(这限制了您在单个节点上运行)。如果count未指定,startMPIcluster则从 mpirun 获取所有信息,使脚本更加灵活。

于 2018-10-03T14:42:13.327 回答