[Rcpp-devel] Rcpp Parallel and Rcpp Armadillo

Maxime To maxime.to at outlook.fr
Tue Dec 9 12:33:30 CET 2014


Hi,

I started to work with Rcpp and I have some trouble to adapt some code. I copy below the following code:

- I want to write a function named contrib1, that is simplified version here, but the idea is that that function makes a large use of the pnorm (and qnorm) on marices and I would like to make it faster by applying the function using Rcpp parallel.

- Then I started with an example that I tried to adapt (http://gallery.rcpp.org/articles/parallel-matrix-transform/) to build the structure Pnorm and the function pPnorm. I also created the function f (I wasn't able to use directly the pnorm function as would Sugar allow...)

The example doesn't work. And I don't really understand why. I guess that it is a problem of memory allocation... Can anyone help me on that point?? Moreover, I was able to build a previous version that was working, but once I started to iterate on the contrib1 function (I execute an optimization algorithm), the RAM memory saturated I wasn't able to figure out why the program was not freeing memory after each execution of the function.

I attach the code below. I am a Rcpp novice, so don't hesitate to comment on strange things....
Thanks for your answers!

Maxime

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

#include <RcppArmadillo.h>
#include <cmath>
#include <algorithm>
#include <RcppParallel.h>

using namespace Rcpp;
using namespace arma;
using namespace std;
using namespace RcppParallel;

// [[Rcpp::depends(RcppArmadillo, RcppParallel)]]

inline double f(double x) { return ::Rf_pnorm5(x, 0.0, 1.0, 1, 0); }

struct Pnorm : public Worker
{
   // source matrix
   mat input;
   
   // destination matrix
   mat output;
   
   // initialize with source and destination
   Pnorm(mat input, mat output) 
      : input(input), output(output) {}
   
   // take the square root of the range of elements requested
   void operator()(std::size_t begin, std::size_t end) {
      std::transform(input.begin() + begin, 
                     input.begin() + end, 
                     output.begin() + begin, 
                     f);
   }
};

mat pPnorm(mat x) {
  
    // allocate the output matrix
    mat output(x.n_rows, x.n_cols);
  
    // Pnorm functor (pass input and output matrixes)
    Pnorm ppnorm(x, output);
  
    // call parallelFor to do the work
    parallelFor(0, x.n_elem, ppnorm);
  
    // return the output matrix
    mat outmat(output.begin(), output.n_rows, output.n_cols);
      return outmat;
}

// [[Rcpp::export]]
mat contrib1(mat my_matrix) {

        mat pbound2    = pPnorm(my_matrix);
    return pbound2;
}


------------------------------------------
### Main R code

rm(list=ls(all=TRUE))

library(Rcpp)
library(RcppGSL)
library(RcppParallel)
library(RcppArmadillo)
setwd('U:/testParallel')

sourceCpp("test.cpp")

asd = matrix(runif(1000), ncol = 100)
contrib1(asd)


 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20141209/8fdd907f/attachment.html>


More information about the Rcpp-devel mailing list