[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