2016-01-05 81 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类更快。 –