2016-03-16 2 views
0

Я пытаюсь выполнить некоторое умножение матрицы с помощью RcppArmadillo. Однако мой код показывает, что не ускоряется с RcppArmadillo.Матричное умножение с RcppArmadillo: Почему это не быстрее?

Я использую Windows_10_Pro с R 3.2.4 и RcppArmadillo 0.6.600.4.0

Например:

library(RcppArmadillo) 
library(inline) 

MCplus <- cxxfunction(signature(X_="numeric", Y_="numeric"),body =' 
arma::mat X = Rcpp::as<arma::mat>(X_); 
arma::mat Y = Rcpp::as<arma::mat>(Y_); 
arma::mat ans = X * Y * X; 
return(wrap(ans)); 
', plugin="RcppArmadillo") 

A <- matrix(1:16000000,4000,4000) 
C <- matrix(2:16000001,4000,4000) 

R_M <- proc.time() 
ans_R <- A%*%C%*%A # test with R 
proc.time() - R_M 

C_M <- proc.time() 
ans_C <- MCplus(A,C) # test with RcppArmadillo 
proc.time() - C_M 

В R выходы:

user system elapsed 
106.75 0.24 106.98 

И RcppArmadillo выходы:

user system elapsed 
108.28 0.23 108.56 

Есть ли что-то, что можно улучшить?

Заранее благодарен!

+0

Для меня более быстрое использование «microbenchmark». Я получил среднее значение 7,36 секунды для R и 5,67 секунды для вашего решения RcppArmadillo. – Raad

+0

Другая проблема заключается в том, что это включает в себя две копии ваших данных: одну при построении матриц Армадилло, а другую при создании объектов R из умноженных результатов. Вы можете избежать этой стоимости, используя расширенные конструкторы Armadillo: см. Http://arma.sourceforge.net/docs.html#Mat для получения дополнительной информации. –

+0

Хорошая точка, и теперь мы получаем это бесплатно бесплатно с атрибутами Rcpp. –

ответ

5

R сам обрабатывает это до LAPACK/BLAS - и код, связанный с R, вызывает вызовы через LAPACK/BLAS. Так что да, оба подхода будут работать с одним и тем же кодом, а различия связаны только с небольшими накладными расходами.

Существует много учебных пособий, в которых рассказывается, как изменить библиотеки LAPACK. Конечно, это зависит от операционной системы. Начните, может быть, с руководства R Installation and Administration и его приложений.

+0

Большое вам спасибо! Означает ли это, что это может быть быстрее, если я изменю свои библиотеки LAPACK, и нет больших различий между двумя подходами к новым библиотекам? – gaofangshu

+1

Да. Например, Revolution Analytics никогда не перестает говорить о том, как их R «быстрее», когда (по существу) все они объединяют (хорошо известный) Intel MKL многопоточный BLAS. Вы можете получить их тоже, или использовать OpenBLAS, или ... Google вокруг, это широко обсуждаемая тема. –

+0

Я попробую. Очень ценю вашу помощь:) – gaofangshu