首页 文章

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

提问于
浏览
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 = [某些线程数]运行它,程序运行得很漂亮但是如果我用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 回答

  • 2

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

    • 简化:snow肯定有效,并且可以像使用其他软件包一样使用Rcpp

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

    • 小心使用线程:如果在雪情境中遇到显式线程问题,请先试用它而不用它,并在基本机制工作后添加它

  • 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命令定义它 .

相关问题