[Rcpp-devel] Rcpp function results are different on different systems
Sokol Serguei
serguei.sokol at gmail.com
Thu Aug 19 17:41:45 CEST 2021
Le 19/08/2021 à 17:04, Naeem Khoshnevis a écrit :
>
> Thank you so much, everyone, for responding to this email.
>
>
> Dirk,
>
> * I didn't think about testing _equality_ of doubles because the
> numbers are significantly different (e.g., instead of 0.5, chooses
> 1.5). However, that is a valid point, and I should be aware of that.
> * You are right about the serial runs. Whenever I deactivate OpenMP,
> the results are correct.
>
>
> Serguei,
>
> * Thanks for the comments. Yes, I agree. It seems outer is a better
> option. We have started with outer. However, outer builds the
> entire matrix of differences first, then finds the minimum index.
> In our application, it requires 200 GB of memory to build that matrix.
>
This problem was hardly foreseeable from examples in hand. But I still
think that a pure R solution can be a runner:
ac=a*sc
bc=b*sc
out=vapply(seq_along(bc), function(i)
which.min(abs(ac-bc[i])+cd[i]), integer(1))
Best,
Serguei.
> * Rcpp does the job with around 10 MB. That is why I switched to
> Rcpp. Please let me know your thoughts.
>
>
> Iñaki,
>
> * Thanks for your suggestion. Yes, the problem is shared values, and
> it resolved the issue. I really appreciate it.
>
>
> Best regards,
> Naeem
>
> On Thu, Aug 19, 2021 at 4:56 AM Iñaki Ucar <iucar at fedoraproject.org
> <mailto:iucar at fedoraproject.org>> wrote:
>
> On Thu, 19 Aug 2021 at 04:53, Dirk Eddelbuettel <edd at debian.org
> <mailto:edd at debian.org>> wrote:
> >
> >
> > Naeem,
> >
> > I would simplify, simplify, simplify -- as 'Rcpp FAQ 7.31'
> reminds us all,
> > testing _equality_ of doubles is challenging anyway.
> >
> > Besides, it may make sense to would ascertain first you get what
> you want in
> > _purely serial modes_ and then move to OpenMP.
>
> Exactly. Serial execution should be fine. I.e., if you set the number
> of threads to 1, then all platforms will return the same result.
> However, you have defined a number of variables outside the parallel
> region, and then you modify them inside the parallel region. OpenMP
> takes those variables as shared by default, which leads to the
> unexpected results you are getting. You need to tell OpenMP that those
> variables are threadprivate. Or you could just define them inside the
> parallel region, so that OpenMP knows that they are private without
> additional hints.
>
> --
> Iñaki Úcar
>
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20210819/b0ab0fdb/attachment.html>
More information about the Rcpp-devel
mailing list