gpt4 book ai didi

matrix-multiplication - Armadillo vs Eigen3 时序差异

转载 作者:行者123 更新时间:2023-12-02 15:22:16 25 4
gpt4 key购买 nike

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

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

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

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

因为 Tensor 包装了 Mat,我预计它的时间会更大。 Armadillo 就是这种情况,平均接近 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,如果它是二阶)或 3D(即 3×3)。 (相比之下,Mat 可以是任何大小)。

我用于计时目的的运算符是:2×2 矩阵(二阶张量)乘以 2×1 矩阵(一阶张量)。当仅使用 Mat 时,我实际上是在使用 Armadillo 或 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 约定)。

最佳答案

“这很复杂。”

我们通过附加包提供 Armadillo 和 Eigen 到 R 的绑定(bind) RcppArmadilloRcppEigen所以经常出现比较和赛马问题。

而且我认为没有明确的答案。使事情变得“更糟”的是, Armadillo 通常指的是您安装的任何 LAPACK/BLAS,因此您可以使用多核并行性,而 Eigen 倾向于更喜欢它自己的例程。在准备我的 Rcpp book 时我做了一些计时,发现了一些违反直觉的结果。

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

关于matrix-multiplication - Armadillo vs Eigen3 时序差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com