我开始使用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
。
但是我认为这不是应该的,所以我想我有一个看不见的潜在错误/错误使用指令。
关于可能出什么问题的任何想法?预先谢谢你。
答案 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获取所有信息,从而使脚本更加灵活。