我的希望是這個討論可能會幫助其他人與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;
}
上張量[]操作訪問數據形成底層存儲墊(通過福格特約定)。
矩陣的大小是多少?你是否在Mat和Tensor案例中將Eigen/Armidillo的矩陣矢量產品稱爲?另外,確保在編譯器優化ON的情況下進行編譯。最後,如果這些言論沒有幫助發現任何問題,那麼在沒有看到任何代碼的情況下很難提供更多的幫助。 – ggael
我已更新問題以解答您提出的一些問題。 –