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

我已经编写了一个函数,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 compile

library(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 process

A <- matrix(rnorm(400), 20,20)

funCPP1(A, 0.5)


## Parallel

cl <- makeCluster(2, type = "SOCK") 

clusterExport(cl, 'funCPP1') 

clusterCall(cl, funCPP1, A, 0.5)


千万里不及你
浏览 735回答 3
3回答

慕工程0101907

仔细考虑-内联有什么用?它为您创建一个C / C ++函数,然后编译并将其链接到可动态加载的共享库中。那人坐在哪里?在R的temp目录中。因此,通过将调用该共享库的R前端运送到另一个进程(具有另一个temp目录!!),您尝试了正确的做法,但是没有在其中获取dll / so文件。因此,建议是创建一个本地软件包,安装它,并让snow过程加载并调用它。(而且一如既往:rcpp-devel列表上可能会有更好的质量答案,与SO相比,更多的Rcpp贡献者可以阅读该列表。)

慕虎7371278

我通过在每个群集群集节点上采购带有所需C内联函数的R文件来解决该问题:clusterEvalQ(cl,&nbsp;&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;library(inline)&nbsp; &nbsp; &nbsp;invisible(source("your_C_func.R"))&nbsp; &nbsp; })并且您的文件your_C_func.R应该包含C函数定义:c_func <- cfunction(...)
打开App,查看更多内容
随时随地看视频慕课网APP