[Rcpp-devel] rcpp overhead

Kaveh Vakili kaveh.vakili at ulb.ac.be
Mon Mar 12 00:43:11 CET 2012


Dear Prof Bates,

i have started to account for the difference 
in performances between the cpp only and the 
rcpp. 

ctrl-f ing the rcpp docs does not give much 
on manipulation of float. Is there a way, in 
rcpp, to use the fact that some parts of the
 algorithm are float-safe?

(....,SEXP R_x,....){
const int n = Rcpp_x.nrow(); 
const int p = Rcpp_x.ncol();
NumericMatrix Rcpp_x(R_x);	
Map<MatrixXd> x(Rcpp_x.begin(),n,p);
MatrixXf x_cen = x.cast<float>();



Best,

>On Sat, Mar 10, 2012 at 6:05 PM, Kaveh Vakili <kaveh.vakili at ulb.ac.be> wrote:
>> Hi Steve,
>>
>> Timing:
>>
>> i use:
>>
>> int start_s=clock();
>> ..
>> ..
>> int stop_s=clock();
>> cout << "time: " << (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000 << endl;
>>
>>
>> Function:
>> Whatever it is, it's coming from these three functions (when i uncoment them, the rest of the code runs in comparable speed).
>>
>> using namespace Rcpp;
>> using namespace Eigen;
>> using namespace std;
>> using Eigen::MatrixXf;
>> using Eigen::VectorXf;
>> using Eigen::RowVectorXf;
>>
>>
>> VectorXi SampleR(int& m,int& p){
>>        int i,j,n=m;
>>        VectorXi x(n);
>>        VectorXi y(p);
>>        x.setLinSpaced(n,0,n-1);
>>        VectorXf urd = VectorXf::Random(p).array().abs();
>>        for(i=0;i<p;i++){
>>                j=n*urd(i);
>>                y(i)=x(j);
>>                --n;
>>                x(j)=x(n);
>>        }
>>        return y;
>> }
>> VectorXf FindLine(MatrixXf& xSub,RowVectorXf& xSub_mean){
>>        int h = xSub.rows();
>>        int p = xSub.cols();
>>        VectorXi RIndex = SampleR(h,p);
>>        VectorXf beta(p);
>>        Eigen::Matrix<float,16,16>A;
>>        for(int i=1;i<p;i++)    A.block(i,0,1,p)=xSub.row(RIndex(i));
>>        A.block(0,0,1,p) = xSub_mean;
>>        beta = VectorXf::Ones(p);
>>        beta = A.topLeftCorner(p,p).lu().solve(beta);
>>        beta/=beta.norm();
>>        return beta;
>> }
>> VectorXf OneDir(MatrixXf& x,MatrixXf& xSub,RowVectorXf& xSub_mean,int& h,
>> VectorXf& proj){
>> VectorXf beta(x.cols());
>> beta = FindLine(xSub,xSub_mean);
>> proj = ((x*beta).array()-xSub_mean.dot(beta)).square();
>> std::nth_element(proj.data(),proj.data()+h,proj.data()+proj.size());
>> return log(proj.head(h).mean());
>> }
>>
>>
>> What do you think --is there something geeky here?
>
>As others have said, it is not exactly clear what you are doing here
>but when you start comparing R and Eigen-based C++ code the natural
>approach is to use the RcppEigen package, which also has a plugin for
>inline.
>
>I happened to post an example of the use of RcppEigen on
>http://dmbates.blogspot.com today.  The example involves sampling from
>a collection of multinomial distributions which seems to be related to
>what you are doing.
>
>>>On Sat, Mar 10, 2012 at 5:58 PM, Kaveh Vakili <kaveh.vakili at ulb.ac.be> wrote:
>>>> Hi all,
>>>>
>>>> the same code when timed in cpp (i.e. without any interfacing with R)
>>>> runs about 2 times faster than when called from R and timed from R's system.time(). In this type of overhead normal or is it a sign i'm doing something not optimally?
>>>
>>>You'll have to provide the code you are using for test (the plain c++
>>>as well as the R/Rcpp hybrid) if you really want smoke this out.
>>>
>>>My guess is that you're doing something a bit wonky (and it might just
>>>be in how you are timing it), but it's impossible to say.
>>>
>>>-steve
>>>
>>>--
>>>Steve Lianoglou
>>>Graduate Student: Computational Systems Biology
>>> | Memorial Sloan-Kettering Cancer Center
>>> | Weill Medical College of Cornell University
>>>Contact Info: http://cbio.mskcc.org/~lianos/contact
>>>
>>>
>>
>> _______________________________________________
>> 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
>
>



More information about the Rcpp-devel mailing list