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)


                                          
_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to