我正在使用Snow软件包开发一个并行R代码,但是当使用Rcpp软件包调用C ++代码时,程序就会挂起并且没有响应。
作为一个例子...... 我在R中使用以下代码将雪分成若干个进程
MyRFunction<-function(i) {
n=i
.Call("CppFunction",n,PACKAGE="MyPackage")
}
if (mpi) {
cl<-getMPIcluster()
clusterExport(cl, list("set.user.Random.seed"))
clusterEvalQ(cl, {library(Rcpp); NULL})
out<-clusterApply(cl,1:mc.cores,MyRFunction)
stopCluster(cl)
}
else
out <- parallel::mclapply(1:mc.cores,MyRFunction)
而我的C ++函数看起来像......
RcppExport SEXP CppFunction(SEXP n) {
int n=as<int>(n);
}
如果我用mpi = false和mc.cores = [某些线程数]运行它,程序运行得很漂亮但是 如果我用mpi = true运行它,因此使用snow,程序只挂起int = as&lt; int&gt;(n)????? 另一方面,如果我将C ++函数定义为...
RcppExport SEXP CppFunction(SEXP n) {
CharacterVector nn(n);
int n=boost::lexical_cast<int>(nn[0]);
}
该程序在每个mpi线程上运行完美?问题是它适用于整数双精度等,但不适用于矩阵 此外,我必须使用boost包中的lexical_cast使其工作,因为&lt;&gt;没有。
有人知道为什么会这样,我在这里缺少什么,所以我也可以加载我的矩阵吗?
答案 0 :(得分:2)
您的问题并不完全清楚您在做什么,但我建议
简化:snow肯定有效,并且可以像使用其他软件包一样使用Rcpp
信任包:当所有节点都是相同的本地包集时,我发现并行计算设置更容易
小心使用线程:如果在雪情境中遇到显式线程问题,请先尝试使用它,然后在基本机制工作后添加它
答案 1 :(得分:0)
最后问题得到了解决,问题似乎在于getMPICluster(),它对纯R代码完全正常,但对Rcpp不太好,如上所述。 而是使用makeMPICluster命令
mc.cores <- max(1, NumberOfNodes*CoresPerNode-1) # minus one for master
cl <- makeMPIcluster(mc.cores)
cat(sprintf("Running with %d workers\n", length(cl)))
clusterCall(cl, function() { library(MyPackage); NULL })
out<-clusterApply(cl,1:mc.cores,MyRFunction)
stopCluster(cl)
效果很好!问题是您必须在R代码中手动定义每个节点的节点数和核心数,而不是使用mpirun命令定义它。