无法在从Snow调用的并行代码中访问C ++代码中的参数

时间:2014-06-12 13:06:18

标签: r rcpp snow

我正在使用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;没有。

有人知道为什么会这样,我在这里缺少什么,所以我也可以加载我的矩阵吗?

2 个答案:

答案 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命令定义它。