1

我正在使用 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=[some number of threads] 运行它,程序运行得很好但是如果我用 mpi=true 运行它,因此使用雪,程序只是挂在 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 才能使其工作,因为 as<> 不能。

有谁知道这是为什么,以及我在这里缺少什么,所以我也可以加载我的矩阵?

4

2 回答 2

2

你的问题并不完全清楚你在做什么,但我建议

  • 简化:snow 确实有效,并且可以与 Rcpp 一起使用,就像与其他软件包一样

  • 信任包:当所有节点都是相同的本地包集时,我发现并行计算设置更容易

  • 小心线程:如果你在雪地环境中使用显式线程有问题,请先尝试不使用它,然后在基本机制工作后添加它

于 2014-06-12T19:21:44.273 回答
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 命令定义它。

于 2014-06-13T07:35:17.033 回答