[Rcpp-devel] When calling same Rcpp function several times different results are returned
Dirk Eddelbuettel
edd at debian.org
Tue Jul 14 12:54:41 CEST 2015
On 14 July 2015 at 09:25, Danas Zuokas wrote:
| I have written parallel implementation of sums in groups using RcppParallel.
Isn't this the same question as
http://stackoverflow.com/questions/31318419/when-calling-same-rcpp-function-several-times-different-results-are-returned
You got some excellent comments there by SO user 'RHertel'. Did you consider those?
Dirk
| // [[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.
|
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list