2016-01-05 78 views
1

我的希望是這個討論可能會幫助其他人與Armadillo和Eigen3有問題。犰狳vs Eigen3定時差

我已經寫了一個包裝類Mat,它包裝了armadillo庫中的arma :: Mat或Eigen3庫中的Eigen :: Matrix。這是在編譯時用一個標誌來控制的。

此外,我寫了一個使用Mat作爲存儲的Tensor類。這個類的主要特徵是使用Voigt符號來壓縮高階張量以正確存儲在矩陣中。最後,我寫了一個測試,將一個二階張量(即矩陣)和一階張量(即一個向量)相乘多次,並記錄完成操作符所需的時間。我通過我的Mat類和Tensor類來做到這一點。

由於Tensor包裹墊,我希望它的時間更大。犰狳就是這種情況,平均接近20%。但是,使用Eigen時,使用張量更快,這對我來說毫無意義。

是否有任何東西貼到任何人?

編輯:提供更多的細節。

我已經第一次將arma :: Mat包裹到myOwn :: armaMat和Eigen :: Matrix到myOwn :: eigenMat中。這兩者都將Armadillo和Eigen的API包裝到一個通用框架中。最後,根據編譯器標誌,myOwn :: Mat包裝armaMat或eigenMat。我不確定我們打開的優化標誌。

如上所述,myOwn :: Tensor使用myOwn :: Mat作爲存儲。由於物理應用我將使用Tensor類,所以它被模板化爲2D(即,如果它是二階的2乘2)或3D(即3乘3)。 (相反,Mat可以是任何尺寸)。

我用於計時目的的操作員是:2乘2矩陣(2階張量)乘以2乘1矩陣(1階張量)。當僅使用Mat時,我基本上使用了犰狳或Eigen的表達模板。

當使用我的張量類,我重載operator *爲這樣:

template< typename T1, bool Sym > 
moris::Mat<T1> 
operator*(
     moris::Tensor< T1, 2, 2, true > const & aTensor1, 
     moris::Tensor< T1, 1, 2, Sym > const & aTensor2) 
{ 

    moris::Mat<T1> tVector(2, 1); 

    tVector(0) = aTensor1[0]*aTensor2[0] + aTensor1[2]*aTensor2[1]; 
    tVector(1) = aTensor1[2]*aTensor2[0] + aTensor1[1]*aTensor2[1]; 

    return tVector; 
} 

上張量[]操作訪問數據形成底層存儲墊(通過福格特約定)。

+0

矩陣的大小是多少?你是否在Mat和Tensor案例中將Eigen/Armidillo的矩陣矢量產品稱爲?另外,確保在編譯器優化ON的情況下進行編譯。最後,如果這些言論沒有幫助發現任何問題,那麼在沒有看到任何代碼的情況下很難提供更多的幫助。 – ggael

+0

我已更新問題以解答您提出的一些問題。 –

回答

5

「這很複雜。」

我們通過附加包RcppArmadilloRcppEigen提供Armadillo和Eigen到R的綁定,因此比較和賽馬問題出現了很多。

我不認爲有明確的答案。爲了使事情「變得更糟」,犰狳一般指的是你安裝的任何LAPACK/BLAS,因此你可以使用多核並行,而Eigen往往更喜歡它自己的例程。當準備我的Rcpp book時,我做了一些時間安排,發現了一些反直覺的結果。

在一天結束時,您可能只需要簡介您的問題。

+0

非常感謝您的回覆,謝謝!最讓我難受的是,使用Eigen時,儘管Tensor包裹Mat,但使用Tensor類比Mat類更快。 –