[Rcpp-devel] Differences between RcppEigen and RcppArmadillo

Dirk Eddelbuettel edd at debian.org
Thu Jun 14 01:00:27 CEST 2012


On 13 June 2012 at 17:16, Dirk Eddelbuettel wrote:
| 
| On 13 June 2012 at 15:05, Julian Smith wrote:
| | I agree that RcppEigen is a little bit faster, but ease of use is important to
| | me, so I feel like RcppArmadillo might win out in my application.
| 
| Yup, that my personal view too.
|  
| | | RcppArmadillo will use the very same LAPACK and BLAS libs your R session
| | | uses. So MKL, OpenBlas, ... are all options.  Eigen actually has its own
| | code
| | | outperforming LAPACK, so it doesn't  as much there.
| | 
| | Why do you think R outperforms RcppArmadillo in this example below? Anyway to
| | speed this up?
| 
| That is odd. "I guess it shouldn't." I shall take another look -- as I
| understand it both should go to the same underlying Lapack routine.  I may
| have to consult with Conrad on this.

Does your machine by chance have four cores?  It looks like I get a scaling
in the number of (hyperthreaded) cores on my box:

R> require(RcppArmadillo)
R> require(inline)
R> require(rbenchmark)
R> 
R> arma.code <- 'using namespace arma; NumericMatrix Xr(Xs); int n = Xr.nrow(), k = Xr.ncol(); mat X(Xr.begin(), n, k, false); mat U; vec s; mat V; svd(U, s, V, X); return wrap(s);'
R> rcppsvd <- cxxfunction(signature(Xs="numeric"), body=arma.code,plugin="RcppArmadillo")
R> 
R> N <- 1000
R> A <- matrix(rnorm(N^2), N)
R> 
R> res <- benchmark(rcppsvd(A), svd(A), replications=10)
R> print(res)
        test replications elapsed relative user.self sys.self user.child sys.child
1 rcppsvd(A)           10 121.389  7.77089   127.448    1.748          0         0
2     svd(A)           10  15.621  1.00000    26.290    4.224          0         0
R> 


Why it does this I am not clear about -- may well be a bug.

Dirk
 

| Thanks for posting a full and reproducible example!
| 
| Dirk
|  
| | require(RcppArmadillo)
| | require(inline)
| | 
| | arma.code <- '
| |   using namespace arma;
| |   NumericMatrix Xr(Xs);
| |   int n = Xr.nrow(), k = Xr.ncol();
| |   mat X(Xr.begin(), n, k, false);
| |   mat U;
| |   vec s;
| |   mat V;
| |   svd(U, s, V, X);
| |   return wrap(s);
| | '
| | rcppsvd <- cxxfunction(signature(Xs="numeric"),
| |                         arma.code,
| |                         plugin="RcppArmadillo")
| | 
| | A<-matrix(rnorm(5000^2), 5000)
| | 
| | > system.time(rcppsvd(A))
| |     user   system  elapsed
| | 1992.406    4.862 1988.737
| | 
| | > system.time(svd(A))
| |    user  system elapsed
| | 652.496   2.641 652.614
| | 
| | On Wed, Jun 13, 2012 at 11:43 AM, Dirk Eddelbuettel <edd at debian.org> wrote:
| | 
| | 
| |     On 13 June 2012 at 10:57, Julian Smith wrote:
| |     | I've been toying with both RcppArmadillo and RcppEigen the past few days
| |     and
| |     | don't know which library to continue using. RcppEigen seems really slick,
| |     but
| |     | appears to be lacking some of the decompositions I want and isn't nearly
| |     as
| |     | fast to code. RcppArmadillo seems about as fast, easier to code up etc.
| |     What
| |     | are some of the advantages/disadvantages of both?
| | 
| |     That's pretty close.  I have been a fan of [Rcpp]Armadillo which I find
| |     easier to get my head around.  Doug, however, moved from [Rcpp]Armadillo
| |     to
| |     [Rcpp]Eigen as it has some things he needs.  Eigen should have a "larger"
| |     API
| |     than Armadillo, but I find the code and docs harder to navigate.
| | 
| |     And you should find Eigen to be a little faster. Andreas Alfons went as far
| |     as building 'robustHD' using RcppArmadillo with a drop-in for RcppEigen (in
| |     package 'sparseLTSEigen'; both package names from memmory and I may have
| |     mistyped).  He reported a performance gain of around 25% for his problem
| |     sets.  On the 'fastLm' benchmark, we find the fast Eigen-based
| |     decompositions
| |     to be much faster than Armadillo.
| | 
| |     | Can you call LAPACK or BLAS from either? Is there a wrapper in RcppEigen
| |     to
| |     | call LAPACK functions? Want some other decomposition methods, dont like
| |     the
| |     | JacobiSVD method in Eigen.
| | 
| |     You need to differentiate between the Eigen and Armadillo docs _for their
| |     libraries_ and what happens when you access the Rcpp* variant from R.
| | 
| |     RcppArmadillo will use the very same LAPACK and BLAS libs your R session
| |     uses. So MKL, OpenBlas, ... are all options.  Eigen actually has its own
| |     code
| |     outperforming LAPACK, so it doesn't  as much there.
| | 
| |     Hope this helps,   Dirk (at useR!)
| | 
| |     |
| |     | ----------------------------------------------------------------------
| |     | _______________________________________________
| |     | 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
| |     --
| |     Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
| | 
| | 
| 
| -- 
| Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com  

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com  


More information about the Rcpp-devel mailing list