[Rcpp-devel] Rcpp Parallel and Rcpp Armadillo

Maxime To maxime.to at outlook.fr
Wed Dec 10 15:01:11 CET 2014


Hi, 

I changed the function as indicated by Dirk and I modify the functions and the program does work now.
However, I am still puzzled by the memory use of the program. when I run a loop of my function in R as in the code below, it seems that the program does not free the memory used in the previous iterations... which is annoying when I need to optimize on my final object.

So I was wondering whether it was a question of declaration of object in my code?

------------------------------------------------------------------------------------------------------------------

sourceCpp("Rcpp/test.cpp") #
qwe = matrix(runif(10000), nrow = 100)
a = contrib1(qwe)
b = qnorm(qwe)
a - b

for (i in 1:20000) a = contrib1(qwe)
----------------------------------------------------------
// test.cpp

#include <RcppArmadillo.h>
#include <cmath>
#include <algorithm>
#include <RcppParallel.h>
#include <boost/math/distributions/inverse_gaussian.hpp>
 
using namespace Rcpp;
using namespace arma;
using namespace std;
using namespace RcppParallel;
 
// [[Rcpp::depends(RcppArmadillo, RcppParallel, BH)]]
 
double qnorm_f(const double& x_q) {
    boost::math::normal s;
    return boost::math::quantile(s, x_q);
};

 
 
struct Qnorm : public Worker
{
   // source matrix
   const RMatrix<double> input_q;
    
   // destination matrix
   RMatrix<double> output_q;
    
   // initialize with source and destination
   Qnorm(const NumericMatrix input_q, NumericMatrix output_q)
      : input_q(input_q), output_q(output_q) {}
    
   // take the Pnorm of the range of elements requested
   void operator()(std::size_t begin, std::size_t end) {
      std::transform(input_q.begin() + begin,
                     input_q.begin() + end,
                     output_q.begin() + begin,
                     ::qnorm_f);
   }
};
 
mat pQnorm(mat xx_q) {
 
    NumericMatrix x_q = Rcpp::as<Rcpp::NumericMatrix>(wrap(xx_q));
   
    // allocate the output matrix
    const NumericMatrix output_q(x_q.nrow(), x_q.ncol());
   
    // Pnorm functor (pass input and output matrices)
    Qnorm qnorm_temp(x_q, output_q);
   
    // call parallelFor to do the work
    parallelFor(0, x_q.length(), qnorm_temp);
   
    // return the output matrix
    mat outmat_q(output_q.begin(), output_q.nrow(),output_q.ncol());
    return outmat_q;
 
}
 
// [[Rcpp::export]]
mat contrib1(mat X1) {
 
    mat test    = pQnorm(X1);
    mat results = test;

    return results;
}

----------------------------------------------------------

> Date: Tue, 9 Dec 2014 09:07:10 -0600
> To: qkou at umail.iu.edu
> CC: maxime.to at outlook.fr; rcpp-devel at lists.r-forge.r-project.org
> Subject: Re: [Rcpp-devel] Rcpp Parallel and Rcpp Armadillo
> From: edd at debian.org
> 
> 
> On 9 December 2014 at 09:46, Qiang Kou wrote:
> | What do you mean by "doesn't work" ? Compiling error or the result is not
> | right?
> | 
> | I just tried the code, and it seems the code can compile and work.
> 
> I am generally very careful about calling back to anything related to R from
> functions to be parallelized.  So for
> 
>      inline double f(double x) { return ::Rf_pnorm5(x, 0.0, 1.0, 1, 0); }
> 
> I think going with an equivalent pnorm() function from Boost / Bh may be better.
> 
> But I am shooting from my hip here as I have not had time to look at this,
> having been out way too late at a nice concert :) 
> 
> Dirk
> 
> -- 
> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20141210/2273b5ed/attachment.html>


More information about the Rcpp-devel mailing list