特征库:特征值计算性能,gcc vs visual studio 2015

Eigen library: eigenvalue computation performance, gcc vs visual studio 2015

我正在尝试使用以下代码段使用 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"Release\" /Ot /Fp"Release\sciencesuit.pch"

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

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

提前致谢。

简短的回答是 cl(Visual Studio 编译器)在性能方面不如 gcc 好,尤其是在涉及 Eigen 等模板库时。

话虽这么说,请尝试将旧版本的 Eigen 与 Visual Studio 一起使用。 Eigen 中有一些变化导致 Visual Studio(例如 this)的性能下降。