我一直试图并行化我的一个Rcpp例程。在这样做的过程中,我一直在尝试遵循jjalaire的Parallel Distance Calculation示例。不幸的是,一旦我编写完所有内容并开始玩游戏,我的R会话就会崩溃。有时在第一次执行后,有时在第三次执行后。老实说,当我运行例行程序时,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会话吗?
有关信息,我正在运行以下内容:
答案 0 :(得分:2)
在rcpp-devel列表上交叉发布此问题后,用户回复并告知我,j
方法中的operator()
循环应介于begin <= j < end
之间而不是begin <= j <= end
之间{1}}这就是我所拥有的。
我做了那个改变并且肯定是努力的,现在一切似乎都在起作用。
似乎过度扩展到达已分配的内存空间仍会导致意外后果......