RCpp并行编程错误崩溃R
问题描述:
我一直在试图并行化我的一个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
答
在rcpp-devel列表上交叉发布这个问题之后,用户回应并让我意识到我的j
在operator()
方法中的循环应该在begin <= j < end
之间,而不是begin <= j <= end
这就是我所拥有的。
我做了这个改变,当然,现在一切都好了。
好像力不从心的那些达到过去分配的内存空间仍然会导致意想不到的后果......
如果你问在RCPP-devel的JJ,可以看见。如果我们把它留在这里,他可能不会。 – 2014-11-24 01:34:18
Roger ...我会为了曝光而交出这个帖子。如果我在那里得到一个很好的答案,我会把它带回这里来结束这个问题,并使QA成为SO社区... – 2014-11-24 02:05:37
根据结果我调整了标题 – 2014-11-24 04:59:33