雪,内联和Rcpp:

Vin*_*ent 12 r rcpp snow

我编写了一个函数Rcpp并用它编译inline.现在,我想在不同的内核上并行运行它,但是我遇到了一个奇怪的错误.这里有一个小例子,其中功能funCPP1可以编译和运行本身很好,但不能被调用snowclusterCall函数.该函数作为单个进程运行良好,但在并行运行时会出现以下错误:

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 
  2 nodes produced errors; first error: NULL value passed as symbol address
Run Code Online (Sandbox Code Playgroud)

以下是一些代码:

## 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)
Run Code Online (Sandbox Code Playgroud)

Dir*_*tel 15

想一想 - 内联有什么作用?它为您创建一个C/C++函数,然后编译并将其链接到一个可动态加载的共享库.那个人坐在哪里?在R的临时目录中.

所以你通过运送R前端调用该共享库到另一个进程(它有另一个临时目录!!)来尝试正确的事情,但是那里没有得到dll/so文件.

因此,建议是创建一个本地包,安装它并加载雪进程并调用它.

(和往常一样:rcpp-devel列表可能会有更好的质量答案,Rcpp提供商比SO更多.)