Я пытаюсь распараллелить одну из моих подпрограмм 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
Если вы спросите на rcpp-разви JJ может видеть; если мы оставим его здесь, он не сможет. –
Роджер ... Я перейду через это в интересах экспозиции. Если я получу хороший ответ, я верну его сюда, чтобы закрыть это и сделать QA полезным для сообщества SO ... –
В свете результатов я скорректировал заголовок –