2014-11-23 2 views
2

Я пытаюсь распараллелить одну из моих подпрограмм Rcpp. При этом я старался следовать примеру Parallel Distance Calculation из jjalaire. К сожалению, как только я все закодировал и начал играть, моя сессия R потерпит крах. Иногда после первого исполнения, иногда после третьего. Честно говоря, это был дерьмовый выстрел, когда R рухнул, когда я запустил рутину. Итак, я скомбинировал свой код с небольшим воспроизводимым примером для игры.Ошибка RCpp Параллельное программирование Ошибка R

Rcpp File (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() 
    } 
} 

ошибка, кажется, напрямую связана с моей установкой переменные _pc и _pcsd в методе operator(). Если я возьму эти вещи, то они значительно улучшатся. Основываясь на примере параллельного вычисления расстояния, я не уверен, что я сделал здесь неправильно. У меня создалось впечатление, что RVector был потокобезопасным. Хотя это мое впечатление, я знаю, что это проблема с потоками. Может ли кто-нибудь помочь мне понять, почему приведенный выше код случайно разбивает мои сеансы R?

Для информации я бегу следующее:

  • Windows 7
  • R: 3.1.2
  • Rtools: 3,1
  • Rcpp: 0.11.3
  • рядный: 0.3.13
  • RStudio: 0.99.62
+0

Если вы спросите на rcpp-разви JJ может видеть; если мы оставим его здесь, он не сможет. –

+0

Роджер ... Я перейду через это в интересах экспозиции. Если я получу хороший ответ, я верну его сюда, чтобы закрыть это и сделать QA полезным для сообщества SO ... –

+0

В свете результатов я скорректировал заголовок –

ответ

2

После перекрестного размещения этого вопроса в списке rcpp-devel пользователь ответил и сообщил мне, что мой цикл выше j в методе operator() должен идти между begin <= j < end, а не begin <= j <= end, что и было у меня.

Я сделал это изменение и уверен, что надув, все, кажется, работает прямо сейчас.

кажется, завышена из них достигают мимо выделенных ячеек памяти по-прежнему приводит к непредвиденным последствиям ...

Смежные вопросы