[Rcpp-devel] Speed of RCppEigen Cholesky decomposition on sparse matrix

Yixuan Qiu yixuanq at gmail.com
Tue Nov 27 17:27:47 CET 2018


This is really a brilliant observation!


Best,
Yixuan


On Tue, Nov 27, 2018 at 9:34 AM Serguei Sokol <serguei.sokol at gmail.com> wrote:
>
> Le 26/11/2018 à 18:23, Hoffman, Gabriel a écrit :
> > I am developing a statistical model and I have a prototype working in R
> > code.  I make extensive use of sparse matrices, so the R code is pretty
> > fast, but hoped that using RCppEigen to evaluate the log-likelihood
> > function could avoid a lot of memory copying and be substantially
> > faster.  However, in a simple  example I am seeing that RCppEigen is
> > 3-5x slower than standard R code for cholesky decomposition of a sparse
> > matrix.  This is the case on R 3.5.1 using RcppEigen_0.3.3.4.0 on both
> > OS X and CentOS 6.9.
> >
> > Since this simple operation is so much slower it doesn't seem like
> > using RCppEigen is worth it in this case.  Is this an issue with BLAS,
> > some libraries or compiler options, or is R code really the fastest
> > option?
> After few checks, it seems to be a test issue. Matrix package stores the
> decomposition somewhere in attributes of the submitted matrix. So the
> the repetitive calls requiring chol() decomposition are not really doing
> the job. Instead, previously stored result is reused.
>
> You can easily convince yourself by "modifying" the matrix C (and thus
> invalidating previous decomposition) by doing something like "C + 0." :
>
> system.time(replicate(10, chol( C )))
> #utilisateur     système      écoulé
> #      0.459       0.011       0.471
> system.time(replicate(10, chol( C+0. )))
> #utilisateur     système      écoulé
> #      5.365       0.060       5.425
> system.time(replicate(10, CholSparse( C+0. )))
> #utilisateur     système      écoulé
> #      3.627       0.035       3.665
>
> On my machine, I have almost identical timing for CholSparse() with or
> without C modification:
>
> system.time(replicate(10, CholSparse( C )))
> #utilisateur     système      écoulé
> #      3.283       0.004       3.289
> which proves that Eigen doesn't store the decomposition for future reuse
> and redo the decomposition at each call on the same matrix.
>
> Best,
> Serguei.
>


More information about the Rcpp-devel mailing list