Eigen :: Tensor和Eigen :: Matrix性能比较

时间:2018-01-05 00:25:42

标签: c++ tensorflow eigen

我想用一个3-D Eigen :: Tensor替换我的代码中的一系列矩阵。考虑到这一点,我尝试比较Tensor和Matrix的表现。

下面的函数“tensorContractTest”执行具有大小为n(n = 500)的秩1张量的(n,n,n)秩3张量的收缩。这种收缩计算n ** 2个点积,因此就运算次数而言,它相当于两个(n,n)矩阵的乘法(下面的函数“matrixProductTest”)。

在Visual Studio 2013上运行时,函数“tensorContractTest”比“matrixProductTest”运行慢约40倍。 可能,我错过了一些东西。感谢帮助。

#include <unsupported/Eigen/CXX11/Tensor>
using namespace Eigen;

// Contracts 3-dimensional (n x n x n) tensor with 1-dimensional (n) tensor. 
// By the number of operations, it's equivalent to multiplication of 
// two (n, n) matrices (matrixProdTest).
Tensor<double, 2>  tensorContractTest(int n)
{
  Tensor<double, 3> a(n, n, n);     a.setConstant(1.);  
  Tensor<double, 1> b(n);           b.setConstant(1.);
  auto indexPair            = array<IndexPair<int>, 1>{IndexPair<int>(2,0)}; 
  Tensor<double, 2> result  = a.contract(b, indexPair); 
  return result;
}

MatrixXd  matrixProductTest(int n)
{ 
  MatrixXd a = MatrixXd::Ones(n, n), result = a * a;
  return result;
}

2 个答案:

答案 0 :(得分:1)

因为Tensor收缩与矩阵乘法不同。

存在用于矩阵乘法的特定算法,例如减少操作总数的Strassen算法。此外,矩阵库经过多年的高度优化,因此通常根据平台(Intel,AMD,ARM)使用矢量化指令(SIMD或AVX)。对于小尺寸矩阵或稀疏模式的矩阵,与非特定代码相比,速度增益很大。

相反,Tensor库往往不太优化。因此,如果你可以将张量数学转换为矩阵代数,那么速度有很多机会增加。

答案 1 :(得分:1)

即使浮点运算的数量是相同的顺序,内存访问模式也完全不同,因此两个操作根本不具有可比性。一般而言,矩阵 - 矩阵运算总是比矩阵向量或向量向量运算更快(就FLOPS而言),因为前者使得能够更好地使用高速缓存,从而几乎最佳地使用CPU的ALU。在你的情况下,你必须读取n ^ 3张量与两个n ^ 2矩阵,因此内存占用量根本不具有可比性。

在内部,Tensor::contract在可能的情况下回退到Eigen的矩阵产品内核,因此性能应成对。