【问题标题】:Eigen library: eigenvalue computation performance, gcc vs visual studio 2015特征库:特征值计算性能,gcc vs Visual Studio 2015
【发布时间】:2017-06-01 06:58:49
【问题描述】:

我正在尝试使用 Eigen 库使用以下代码来提高特征值和特征向量计算的性能:

MatrixXd eigMat =m.ToMatrixXd(); //internal conversion to MatrixXd
EigenSolver<MatrixXd> es(eigMat,ShouldComputeEigenVectors);

最初我使用旧版本的 Eigen 和 tdm-gcc 4.8 并使用 O2 级别的优化编译代码。计算 1000 x 1000 矩阵的特征值和向量大约需要 5.4 秒

几个月前,我已切换到 Visual Studio Community 2015 并将 Eigen 库升级到 Eigen 3.3.2。现在同样的计算需要 18.7 秒。为什么我的性能比 gcc 4.8 更差?有什么办法可以让我回到 5.4 秒(不用说目标是赶上在 0.8 秒内执行的 Matlab)。

VS 2015 的设置:

/GS /Qpar /GL /analyze- /W3 /Gy /Zc:wchar_t /I"C:\wxWidgets-3.1.0\lib\vc_dll\mswu" /Zi /Gm- /O2 /Ob2 /sdl / Fd"Release\vc140.pdb" /Zc:inline /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_UNICODE" /D "__WXMSW__" /D "UNICODE" /D "WXUSINGDLL" /D "NDEBUG " /D "EIGEN_NO_DEBUG" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /arch:SSE2 /Gd /Oy- /Oi /MD /openmp /Fa"Release\" /EHsc /nologo /Fo"发布\" /Ot /Fp"发布\sciencesuit.pch"

顺便说一句,我尝试了以下方法,但没有或几乎没有(1 秒)性能提升:

  1. 不同的指令集,例如 AVX2
  2. 浮动模型点,快速
  3. OpenMP 和无 OpenMP 选项
  4. 优化,完全优化 Ox

提前致谢。

【问题讨论】:

  • 如果矩阵是对称的,使用SelfAdjointEigenSolver会更快。为配合 MatLab 速度,可以使用MKL support进行编译
  • 是的,我已经集成了SelfAdjointEigenSolver,时间是0.5秒,在矩阵对称的情况下快了将近20倍。

标签: c++ visual-studio gcc eigen eigen3


【解决方案1】:

简而言之,cl(Visual Studio 编译器)在性能方面不如 gcc,尤其是在 Eigen 等模板库方面。

话虽如此,请尝试在 Visual Studio 中使用旧版本的 Eigen。 Eigen 中的一些变化导致 Visual Studio 的性能下降(例如this)。

【讨论】:

  • 是否有可以推荐降级到的特定版本?我必须升级的原因是因为我无法用 VS2015 编译 Eigen。顺便说一句,我没有使用其他一些功能降低性能,例如行列式、QR。鲁。只有特征值和向量计算受到很大影响。
  • 尝试 3.2.10。为什么你不能用 VS2015 编译一个旧的 Eigen,你会得到什么错误?
  • 我用 3.2.5 试过了,显着改进,缩短到 10 秒。
  • 已尝试使用 3.2.10 并再次尝试了 10 秒。 3.3.x 的任何内容都在 18 到 19 秒左右。
  • 好吧,如果我们比较svd分解,那么结果是有利于VS的。但是,是的,就我而言,到目前为止,在 eigen gcc 中表现更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多