[Rcpp-devel] Speed gain assistance

Wray, Christopher christopher.wray.10 at ucl.ac.uk
Tue Aug 16 18:51:03 CEST 2011


Hi list - although not strictly (or not really at all..) an Rcpp problem - I thought that since there are so many 'better-than-I' c++ coders here - whom are familiar with R... it might be a good place to ask.

I have a "naive" piece of code - that in essence replicates what the R function "sample" does.

Here is a full/toy example using inline, below.

My problem is this is used in part of a larger piece of code.. and it is a major bottleneck... Where I have put 50,000 in the function below - what I am really using is
10,000,000 so sscpp2(ttin,10000000,1.0,126) is the real function call.

I have toyed with the idea of running all the "runifs" at once (hence the make_matrix function) but R complains about allocating large vectors..sometimes.

I have also tried using std::random_shuffle (to get rid of the runifs) - although performance is then dependent upon the size of the incoming vector 'RetIn' (why shuffle all the elements when I only need some, etc).

I have thought (but not tried) importing R's sample function...but I suspect this may be a totally rude idea.

If anyone has time, or inclination, if they spot a dumb idea in my code - or know a better Rcpp way to do this - Id much appreciate it!

Thanks, chris



________________________________

library(inline); library(Rcpp);

inc<-'
using namespace Rcpp;

double Fn(double a, double b)
{
return std::max(0.0,exp(a)-b);
}


SEXP make_matrix(int nr, int nc, int d){

                NumericVector y=floor(runif(nr*nc)*(d-1));
                y.attr("dim")=Dimension(nr,nc);
                return y;
}

'

src<-'


NumericVector RetIn(RetVec);
int SS_C=as<int>(SamSize);
double St_C=as<double>(StM);
int ES_C=as<int>(ExpSize);
int i,j;


NumericVector OutVec=rep(0.0,SS_C),SamIndx(ES_C);

RNGScope scope;

//NumericMatrix SamIndx=make_matrix(SS_C,ES_C,RetIn.size()-1);


for(j=0;j<SS_C;j++)
{
SamIndx=floor(runif(ES_C)*(RetIn.size()-1));

                for(i=0; i<ES_C; i++)
                {
                OutVec[j]+=RetIn[SamIndx[i]];
                }
}

NumericVector strVEC=rep(St_C,SS_C), ans(SS_C);
std::transform(OutVec.begin(),OutVec.end(),strVEC.begin(),ans.begin(),Fn);
double MeanOut=mean(ans);

return(wrap(MeanOut));
'

sscpp2<-cfunction( signature(RetVec="numericVector",SamSize="numeric",StM="numeric",ExpSize="numeric"), src,inc, Rcpp=TRUE,cppargs="",convention=".Call")


ttin=runif(2000)/10000
sscpp2(ttin,50000,1.0,126)
#####
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20110816/369ebbe4/attachment.htm>


More information about the Rcpp-devel mailing list