[Rcpp-devel] When calling same Rcpp function several times different results are returned

Danas Zuokas danas.zuokas at gmail.com
Tue Jul 14 08:25:03 CEST 2015


I have written parallel implementation of sums in groups using RcppParallel.

// [[Rcpp::depends(RcppParallel)]]#include <Rcpp.h>#include <RcppParallel.h>
using namespace Rcpp;
using namespace RcppParallel;

struct SumsG: public Worker{
  const RVector<double> v;
  const RVector<int> gi;

  RVector<double> sg;

  SumsG(const NumericVector v, const IntegerVector gi, NumericVector
sg): v(v), gi(gi), sg(sg) {}
  SumsG(const SumsG& p, Split): v(p.v), gi(p.gi), sg(p.sg) {}

  void operator()(std::size_t begin, std::size_t end) {
    for (std::size_t i = begin; i < end; i++) {
      sg[gi[i]] += v[i];
    }
  }

  void join(const SumsG& p) {
    for(std::size_t i = 0; i < sg.length(); i++) {
      sg[i] += p.sg[i];
    }
  }};
// [[Rcpp::export]]
List sumsingroups(NumericVector v, IntegerVector gi, int ni) {
  NumericVector sg(ni);
  SumsG p(v, gi, sg);
  parallelReduce(0, v.length(), p);

  return List::create(_["sg"] = p.sg);}

It compiles using Rcpp::sourceCpp. Now when I call it from R sumsingroups(1:10,
rep(0:1, each = 5), 2) several times I get the right answer (15 40) and
then something different (usually some multiplicative of the right answer).
Running

res <- sumsingroups(1:10, rep(0:1, each = 5), 2)for(i in 1:1000) {
    tmp <- sumsingroups(1:10, rep(0:1, each = 5), 2)
    if(res[[1]][1] != tmp[[1]][1]) break
    Sys.sleep(0.1)}

breaks at random iteration returning

$sg[1]  60 160

or

$sg[1] 30 80

I am new to Rcpp and RcppParallel and do not know what could cause such
behavior.

Things that did not help:

   1. Added for (std::size_t i = 0; i < sg.length(); i++) sg[i] = 0; to
   both of constructors.
   2. Changed names so that they are different in Worker definition and in
   function implementation.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20150714/24c0a39d/attachment-0001.html>


More information about the Rcpp-devel mailing list