如何从R包中的动态库评估C函数?

时间:2018-10-29 21:47:46

标签: r parallel-processing rparallel

我正在尝试在R包中实现并行计算,该R包使用.C函数从R调用C。集群的节点似乎无法访问动态库。我做了一个并行套接字集群,像这样:

cl <- makeCluster(2)

我想使用valgrad在R包并行中从群集中每个节点上的R包评估一个名为clusterEvalQ的C函数。但是,我的代码产生了错误。我编译了程序包,但是运行

out <- clusterEvalQ(cl, cresults <- .C(C_valgrad, …))

其中代表C函数valgrad中的参数。我收到此错误:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: object 'C_valgrad' not found

我怀疑clusterEvalQ的访问动态库的能力存在问题。我试图通过使用

将glmm程序包加载到群集中来解决此问题。
clusterEvalQ(cl, library(glmm))

但这不能解决问题。

我可以使用foreach R包中的valgrad函数在每个集群上评估foreach,如下所示:

out <- foreach(1:no_cores) %dopar% {.C(C_valgrad, …)}

no_cores是集群中的节点数。但是,此功能不允许在群集上的任何后续计算中访问valgrad的评估结果。

我怎么能

(1)使valgrad的评估结果可访问,以便以后在群集或

上进行计算

(2)使用clusterEvalQ评估valgrad吗?

1 个答案:

答案 0 :(得分:1)

您必须加载外部库。但这不是通过library调用完成的,而是通过dyn.load完成的。
如果使用多个操作系统,以下两个功能很有用,它们使用内置变量.Platform$dynlib.ext
另请注意卸载功能。如果您开发C函数库,则将需要它。如果在测试前更改了C函数,则必须卸载动态库,然后重新加载(新版本)。

请参见编写R扩展,在doc文件夹中的R-exts.pdf文件的第5部分或CRAN上。

dynLoad <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.load(dynlib)
}

dynUnload <- function(dynlib){
    dynlib <- paste(dynlib, .Platform$dynlib.ext, sep = "")
    dyn.unload(dynlib)
}