[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