Я написал функцию в 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)