RcppParallel对线程安全有什么限制?

时间:2016-03-24 17:35:10

标签: r parallel-processing rcpp tbb

我很抱歉这个问题毫无希望地含糊不清,但是我的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))

0 个答案:

没有答案