犰狳与Eigen3时间差异

时间:2016-01-05 22:00:40

标签: matrix-multiplication timing armadillo eigen3

我希望这个讨论可以帮助其他任何与Armadillo和Eigen3有问题的人。

我编写了一个包装类Mat,它包含来自armadillo库的arma :: Mat或来自Eigen3库的Eigen :: Matrix。这在编译时用标志控制。

此外,我还编写了一个使用Mat作为存储的Tensor类。该类的主要特征是使用Voigt表示法来压缩高阶张量,以便正确存储在矩阵中。

最后,我编写了一个多次乘以二阶张量(即矩阵)和一阶张量(即矢量)的测试,并记录完成算子所需的时间。我用Mat类和Tensor类来做这个。

因为Tensor包裹了Mat,我希望它的时间更长。犰狳就是这种情况,平均接近20%。但是,当使用Eigen时,使用Tensor会更快,这对我来说毫无意义。

有什么事情适合任何人吗?

编辑:提供更多详情。

我首先将arma :: Mat包装成myOwn :: armaMat,将Eigen :: Matrix包装到myOwn :: eigenMat中。这两者都只是将armadillo和Eigen的API包装到一个通用框架中。最后,基于编译器标志,myOwn :: Mat包装了一个armaMat或一个eigenMat。我不确定我们开启的任何优化标志。

如上所述,myOwn :: Tensor使用myOwn :: Mat作为存储。由于我将使用Tensor类的物理应用,它被模板化为2D(即,如果它是2阶)则是2乘2(或3乘3)。 (相比之下,Mat可以是任何尺寸)。

我用于定时目的的运算符是:2乘2矩阵(二阶张量)乘以2乘1矩阵(一阶张量)。当仅使用Mat时,我主要使用犰狳或Eigen的表达模板。

当使用我的Tensor类时,我正在重载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;
}

Tensor上的[]运算符从底层存储Mat访问数据(通过Voigt约定)。

1 个答案:

答案 0 :(得分:5)

&#34;它很复杂。&#34;

我们通过附加软件包RcppArmadilloRcppEigen为Armadillo和Eigen提供绑定,因此比较和赛马问题出现了很多。

我认为没有一个明确的答案。为了解决问题&#34;更糟糕的是,犰狳通常指的是你安装的任何LAPACK / BLAS,因此你可以使用多核并行,而Eigen倾向于选择自己的例程。准备我的Rcpp book时,我做了一些时间安排,发现了一些反直觉的结果。

在一天结束时,您可能只需要了解您的问题。