gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:13:58 24 4
gpt4 key购买 nike

我正在尝试在一个 R 包中实现并行计算,该包使用 .C 函数从 R 调用 C。集群的节点好像访问不到动态库。我制作了一个并行套接字集群,如下所示:

cl <- makeCluster(2)

我想使用 R 包并行中的 clusterEvalQ 从我的 R 包中的每个节点上评估一个名为 valgrad 的 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 包中的 foreach 函数在每个集群上评估 valgrad,如下所示:

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

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

我该怎么办

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

(2) 使用clusterEvalQ 计算valgrad?

最佳答案

您必须加载外部库。但这不是通过 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)
}

关于r - 如何评估 R 包中动态库中的 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53054331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com