我很抱歉这个问题毫无希望地含糊不清,但是我的MWE不能像我希望的那样工作(从我实际想要解决的更复杂的问题中提炼出来,所以不要嘲笑它作为存在一个玩具。)。首先是Rcpp
代码:
// accumulate # of non-na elements seen on the input iterator.
void accum_nonna(RVector<double>::const_iterator vecit,
RVector<double>::const_iterator end,
RVector<int>::iterator xret) {
for (;vecit != end;++vecit) {
if (! NumericVector::is_na(*vecit)) { *xret += 1; }
}
}
struct MWE : public Worker
{
// source vector
const RVector<double> input;
// accumulated value
RVector<int> output;
// constructors
MWE(const NumericVector input, IntegerVector output) : input(input), output(output) {}
MWE(const MWE& mwes, Split) : input(mwes.input), output(mwes.output) {}
// accumulate just the element of the range I have been asked to
void operator()(std::size_t begin, std::size_t end) {
accum_nonna(input.begin() + begin, input.begin() + end, output.begin());
}
// join my value with that of another MWE
void join(const MWE& rhs) {
output[0] += rhs.output[0];
}
};
// [[Rcpp::export]]
IntegerVector dumbCount(NumericVector x) {
// allocate the output
IntegerVector output(1);
// declare the instance
MWE mwes(x,output);
// call parallel_reduce to start the work
parallelReduce(0, x.length(), mwes, 5000);
// return the computed number of non-na elements
return output;
}
就用户所见,你在名为R
的{{1}}中得到一个愚蠢的函数,它计算输入向量中非NA元素的数量。当输入在粒度5000以下时似乎工作正常,但是当它超过它时不起作用:
dumbCount
显然,我做了一些非线程安全的事情。
我怀疑是> source('mwe.cpp')
> dumbCount(rnorm(4995))
[1] 4995
> dumbCount(rnorm(5005))
[1] 7112
操作,但我注意到当我将join
中的代码更改为operator()
(以解决不同的玩具问题)时,我得到一个完全不同的失败模式,因为output[0] = end - begin;
似乎没有真正起作用,而join
相当一致地返回dumbCount(rnorm(5001))
。