我正在使用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 <int>(n )?????另一方面,如果我将C函数定义为......
RcppExport SEXP CppFunction(SEXP n) {
CharacterVector nn(n);
int n=boost::lexical_cast<int>(nn[0]);
}
该程序在每个mpi线程上运行完美?问题是它适用于整数双精度等,但不适用于矩阵 . 此外,我必须使用boost包中的lexical_cast使其工作,因为<>没有 .
有谁知道这是为什么,我在这里缺少什么,所以我也可以加载我的矩阵?
2 回答
你的问题并不完全清楚你在做什么,但我建议你这样做
简化:snow肯定有效,并且可以像使用其他软件包一样使用Rcpp
trust packages:当所有节点都是相同的本地包集时,我发现并行计算设置更容易
小心使用线程:如果在雪情境中遇到显式线程问题,请先试用它而不用它,并在基本机制工作后添加它
最后问题得到了解决,问题似乎在于getMPICluster(),它对于纯R代码完全正常,但对于Rcpp不太好,如上所述 . 而是使用makeMPICluster命令
效果很好!问题是您必须手动定义R代码中每个节点的节点数和核心数,而不是使用mpirun命令定义它 .