【发布时间】: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 秒)性能提升:
- 不同的指令集,例如 AVX2
- 浮动模型点,快速
- OpenMP 和无 OpenMP 选项
- 优化,完全优化 Ox
提前致谢。
【问题讨论】:
-
如果矩阵是对称的,使用
SelfAdjointEigenSolver会更快。为配合 MatLab 速度,可以使用MKL support进行编译 -
是的,我已经集成了
SelfAdjointEigenSolver,时间是0.5秒,在矩阵对称的情况下快了将近20倍。
标签: c++ visual-studio gcc eigen eigen3