2014-06-12 24 views
1

我正在使用Snow包開發並行R代碼,但使用Rcpp包調用C++代碼時,程序只是掛起並且沒有響應。無法在並行代碼中調用C++代碼中的參數Snow

作爲一個例子... 我有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運行它,因此使用雪,程序只是掛在int =int >(n)????? 在另一方面,如果我定義的C++函數作爲...

RcppExport SEXP CppFunction(SEXP n) { 
     CharacterVector nn(n); 
     int n=boost::lexical_cast<int>(nn[0]); 
     } 

該程序完全運行在每個MPI螺紋??問題是,它適用於整數加倍等,但不是矩陣 此外,我必須使用boost包中的lexical_cast使其起作用,因爲<>不。

有人知道這是爲什麼,我在這裏失蹤,所以我可以加載我的矩陣?

+0

可能的重複http://stackoverflow.com/questions/6074310/snow-inline-rcpp?rq=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命令來定義它。

+0

您應該編輯您的問題,而不是傾銷未回答的答案。 –

2

它不是從你的問題,你在做什麼,但我會建議

  • 簡化完全清楚:雪肯定的作品,並與RCPP工作,它與其他軟件包確實

  • 信任包:當所有節點都是相同的本地包時,我發現並行計算設置更容易

  • 請小心線程:如果您在雪情況下顯式線程有問題,請在沒有它​​的情況下嘗試而加一次基本機制工作

+0

我想它不像我認爲的那樣引用的問題是一樣的,因爲你也回答了這個問題。 –

+0

感謝您的建議。我已經在Rcpp郵件列表中提出了這個問題,並希望有人知道我在做什麼錯誤 – MenzZana

+0

嗯,我是該列表的所有者/管理員,所以我會告訴你在那裏(但還有其他知識豐富的用戶)。儘管您的帖子還沒有完成,所以請確保您已訂閱。 –