Я хочу ускорить умножение матриц в R с помощью библиотеки C ++ Eigen.
Каким-то образом моя простая функция eigen_mult
работает очень по-разному, если положить ее в пакет.
// [[Rcpp::depends(RcppEigen)]]
#include <RcppEigen.h>
//[[Rcpp::export]]
Eigen::MatrixXd eigen_mult(Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> X){
return(A * X);
}
Результаты тестов:
set.seed(1)
A <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
B <- matrix(rnorm(1000000), ncol = 1000, nrow = 1000)
microbenchmark::microbenchmark(
"base R" = A %*% B,
"Eigen1" = eigen_mult(A, B),
"Eigen2" = svmod::eigen_mult2(A,B), # exactly the same function but within a package
times = 10
)
Unit: milliseconds
expr min lq mean median uq max neval
base R 685.4485 744.8911 921.5104 878.4409 1040.7563 1405.5009 10
Eigen1 173.9677 180.8769 201.6563 198.3676 218.2076 240.8219 10
Eigen2 6495.3652 6533.3584 6937.0707 7031.7074 7135.5751 7292.6177 10
Почему это происходит? Вот ссылка на функцию в пакете https://github.com/alexandergerber/svmod/blob/master/src/utility.cpp
Редактировать
В своей сессии Info я обнаружил, что в то время пакет работал плохо, и RcppEigen
были loaded via a namespace (and not attached)
:
other attached packages:
[1] microbenchmark_1.4-6
loaded via a namespace (and not attached):
[1] compiler_3.5.1 RcppEigen_0.3.3.4.0 Matrix_1.2-14 tools_3.5.1 yaml_2.2.0 Rcpp_0.12.19 svmod_0.1.0
[8] grid_3.5.1 lattice_0.20-35
Принимая во внимание, что сеанс, в котором он работает, выглядит следующим образом:
other attached packages:
[1] svmod_0.1.0 microbenchmark_1.4-6
loaded via a namespace (and not attached):
[1] compiler_3.5.1 Matrix_1.2-14 tools_3.5.1 yaml_2.2.0 Rcpp_0.12.19 grid_3.5.1 lattice_0.20-35
Я не знаю, как воспроизвести первый сеанс, чтобы проверить, является ли это источником проблемы.