为了账号安全,请及时绑定邮箱和手机立即绑定

在Snow的并行代码中使用Rcpp创建集群

在Snow的并行代码中使用Rcpp创建集群

千万里不及你 2019-11-04 11:04:12
我已经编写了一个函数,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贡献者可以阅读该列表。)


查看完整回答
反对 回复 2019-11-04
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我通过在每个群集群集节点上采购带有所需C内联函数的R文件来解决该问题:


clusterEvalQ(cl, 

    {

     library(inline)

     invisible(source("your_C_func.R"))

    })

并且您的文件your_C_func.R应该包含C函数定义:


c_func <- cfunction(...)


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 728 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信