2014-11-23 51 views
2

我一直在試圖並行化我的一個Rcpp例程。在這樣做的過程中,我一直試圖遵循jjalaire的Parallel Distance Calculation示例。不幸的是,一旦我把所有的東西都編碼並開始玩,我的R會話就會崩潰。有時在第一次執行後,有時在第三次執行後。說實話,這是一個關於什麼時候R會在我運行例程時崩潰的垃圾短片。所以,我已經將我的代碼與一個可重複使用的小例子配對。RCpp並行編程錯誤崩潰R

RCPP文件(mytest.cpp)

#include <Rcpp.h> 
// [[Rcpp::depends(RcppParallel)]] 
#include <RcppParallel.h> 

using namespace std; 
using namespace Rcpp; 
using namespace RcppParallel; 

struct MyThing : public Worker { 
    RVector<double> _pc; 
    RVector<double> _pcsd; 

    MyThing(Rcpp::NumericVector _pc, Rcpp::NumericVector _pcsd) : _pc(_pc), _pcsd(_pcsd){} 

    void operator()(std::size_t begin, std::size_t end) { 

    for(int j = begin; j <= end; j++) {  
     _pc[j] = 1; 
//  _pcsd[j] = 1; 
    } 
    }  
}; 

// [[Rcpp::export]] 
void calculateMyThingParallel() { 

    NumericVector _pc(100); 
    NumericVector _pcsd(100); 

    MyThing mt(_pc, _pcsd); 

    parallelFor(0, 100, mt); 
} 

[R編譯和執行腳本(mytest.R)

library(Rcpp) 
library(inline) 

sourceCpp('mytest.cpp') 

testmything = function() { 
    calculateMyThingParallel() 
} 

if(TRUE) { 
    for(i in 1:20) { 
    testmything() 
    } 
} 

錯誤似乎是直接關係到我的設置operator()方法中的_pc和_pcsd變量。如果我把這些拿出來,事情會大大改善。基於平行距離計算示例,我不確定這裏我做錯了什麼。我的印象是RVector是線程安全的。雖然這是我的印象,但我知道這是線程的問題。任何人都可以幫助我理解爲什麼上面的代碼會隨機崩潰我的R會話嗎?

的信息我運行的是以下幾點:

  • Windows 7的
  • R:3.1.2
  • Rtools:3.1
  • RCPP:0.11.3
  • 在線:0.3.13
  • RStudio:0.99.62
+0

如果你問在RCPP-devel的JJ,可以看見。如果我們把它留在這裏,他可能不會。 – 2014-11-24 01:34:18

+0

Roger ...我會爲了曝光而交出這個帖子。如果我在那裏得到一個很好的答案,我會把它帶回這裏來結束這個問題,並使QA成爲SO社區... – 2014-11-24 02:05:37

+0

根據結果我調整了標題 – 2014-11-24 04:59:33

回答

2

在rcpp-devel列表上交叉發佈這個問題之後,用戶迴應並讓我意識到我的joperator()方法中的循環應該在begin <= j < end之間,而不是begin <= j <= end這就是我所擁有的。

我做了這個改變,當然,現在一切都好了。

好像力不從心的那些達到過去分配的內存空間仍然會導致意想不到的後果......