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 <e...@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@lists.r-forge.r-project.org | | | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel | | -- | | Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com | | | | | | -- | Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com -- Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel