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 スレッドで完全に実行されますか?? 問題は、整数倍精度などでは機能しますが、行列では機能しないことです。

これがなぜなのか、そして私がここで何が欠けているのか知っている人はいますか?

4

2 に答える 2

2

あなたの質問からあなたが何をしているのか完全には明らかではありませんが、私はお勧めします

  • 単純化: snow は確かに機能し、他のパッケージと同様に Rcpp でも機能します

  • trust packages: すべてのノードが同一のローカル パッケージ セットである場合、並列計算のセットアップがより簡単であることがわかりました

  • スレッド化には注意してください: 雪のコンテキストで明示的なスレッド化に問題がある場合は、最初にそれなしで試して、基本的な仕組みが機能したら追加してください

于 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)

よく働く!問題は、mpirun コマンドを使用して定義するのではなく、R コード内でノード数とノードあたりのコア数を手動で定義する必要があることです。

于 2014-06-13T07:35:17.033 に答える