其他分享
首页 > 其他分享> > c – 单精度矩阵运算的特征性能AVX与SSE没有差异?

c – 单精度矩阵运算的特征性能AVX与SSE没有差异?

作者:互联网

在我的项目中,我使用Eigen3.3库来进行6×6矩阵的计算.我决定调查AVX指令是否真的让我对SSE加速.我的CPU确实支持这两组:

model name      : Intel(R) Xeon(R) CPU E5-1607 v2 @ 3.00GHz
flags           : ...  sse sse2 ... ssse3 ... sse4_1 sse4_2 ... avx ...

所以,我用gcc4.8编译了一个小测试,使用两组不同的标志:

$g++ test-eigen.cxx -o test-eigen -march=native -O2 -mavx
$g++ test-eigen.cxx -o test-eigen -march=native -O2 -mno-avx

我确认使用-mno-avx的第二种情况没有产生任何带ymm寄存器的指令.然而,这两个案例给出了非常相似的结果,用perf测量的约520ms.

这是程序test-eigen.cxx(它与两个矩阵的总和相反,只是接近我正在处理的实际任务):

#define NDEBUG

#include <iostream>
#include "Eigen/Dense"

using namespace Eigen;

int main()
{
   typedef Matrix<float, 6, 6> MyMatrix_t;

   MyMatrix_t A = MyMatrix_t::Random();
   MyMatrix_t B = MyMatrix_t::Random();
   MyMatrix_t C = MyMatrix_t::Zero();
   MyMatrix_t D = MyMatrix_t::Zero();
   MyMatrix_t E = MyMatrix_t::Constant(0.001);

   // Make A and B symmetric positive definite matrices
   A.diagonal() = A.diagonal().cwiseAbs();
   A.noalias() = MyMatrix_t(A.triangularView<Lower>()) * MyMatrix_t(A.triangularView<Lower>()).transpose();

   B.diagonal() = B.diagonal().cwiseAbs();
   B.noalias() = MyMatrix_t(B.triangularView<Lower>()) * MyMatrix_t(B.triangularView<Lower>()).transpose();

   for (int i = 0; i < 1000000; i++)
   {
      // Calculate C = (A + B)^-1
      C = (A + B).llt().solve(MyMatrix_t::Identity());

      D += C;

      // Somehow modify A and B so they remain symmetric
      A += B;
      B += E;
   }

   std::cout << D << "\n";

   return 0;
}

我真的期望在Eigen中使用AVX获得更好的性能吗?或者我在编译器标志或特征配置中遗漏了什么?我的测试可能不适合展示差异,但我不知道它可能有什么问题.

解决方法:

您使用太小的矩阵来使用AVX:单精度,AVX一次处理8个标量的数据包.当使用6×6矩阵时,AVX只能用于纯粹的分量操作,如A = BC,因为它们可以看作是大小为36的1D向量上的操作,大于8.在这种情况下,这些操作可以忽略不计与Cholesky分解和解决的成本相比.

要查看差异,请移至尺寸为100×100或更大的MatrixXf矩阵.

标签:c,eigen,sse,avx
来源: https://codeday.me/bug/20190828/1751197.html