我已经编写了一个函数,Rcpp并使用进行了编译inline。现在,我想在不同的内核上并行运行它,但是遇到一个奇怪的错误。这是一个最小的示例,该函数funCPP1可以编译并运行良好,但不能由snow的clusterCall函数调用。该函数可以作为单个进程很好地运行,但是在并行运行时会出现以下错误:Error in checkForRemoteErrors(lapply(cl, recvResult)) : 2 nodes produced errors; first error: NULL value passed as symbol address这是一些代码:## Load and compilelibrary(inline)library(Rcpp)library(snow)src1 <- ' Rcpp::NumericMatrix xbem(xbe); int nrows = xbem.nrow(); Rcpp::NumericVector gv(g); for (int i = 1; i < nrows; i++) { xbem(i,_) = xbem(i-1,_) * gv[0] + xbem(i,_); } return xbem;'funCPP1 <- cxxfunction(signature(xbe = "numeric", g="numeric"),body = src1, plugin="Rcpp")## Single processA <- matrix(rnorm(400), 20,20)funCPP1(A, 0.5)## Parallelcl <- makeCluster(2, type = "SOCK") clusterExport(cl, 'funCPP1') clusterCall(cl, funCPP1, A, 0.5)
3 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
仔细考虑-内联有什么用?它为您创建一个C / C ++函数,然后编译并将其链接到可动态加载的共享库中。那人坐在哪里?在R的temp目录中。
因此,通过将调用该共享库的R前端运送到另一个进程(具有另一个temp目录!!),您尝试了正确的做法,但是没有在其中获取dll / so文件。
因此,建议是创建一个本地软件包,安装它,并让snow过程加载并调用它。
(而且一如既往:rcpp-devel列表上可能会有更好的质量答案,与SO相比,更多的Rcpp贡献者可以阅读该列表。)
慕虎7371278
TA贡献1802条经验 获得超4个赞
我通过在每个群集群集节点上采购带有所需C内联函数的R文件来解决该问题:
clusterEvalQ(cl,
{
library(inline)
invisible(source("your_C_func.R"))
})
并且您的文件your_C_func.R应该包含C函数定义:
c_func <- cfunction(...)
- 3 回答
- 0 关注
- 771 浏览
添加回答
举报
0/150
提交
取消