我注意到使用Eigen库对Cholesky分解有显着的性能差异.
我正在使用最新版本的Eigen(3.2.1)以及以下基准代码:
#include <iostream>
#include <chrono>
#include <Eigen/Core>
#include <Eigen/Cholesky>
using namespace std;
using namespace std::chrono;
using namespace Eigen;
int main()
{
const MatrixXd::Index size = 4200;
MatrixXd m = MatrixXd::Random(size, size);
m = (m + m.transpose()) / 2.0 + 10000 * MatrixXd::Identity(size, size);
LLT<MatrixXd> llt;
auto start = high_resolution_clock::now();
llt.compute(m);
if (llt.info() != Success)
cout << "Cholesky decomposition failed!" << endl;
auto stop = high_resolution_clock::now();
cout << "Cholesky decomposition in "
<< duration_cast<milliseconds>(stop - start).count()
<< " ms." << endl;
return 0;
}
我用g -std = c 11 -Wall -O3 -o bench bench.cc编译这个基准测试并在Windows上第一次运行它(使用MinGW,[编辑:GCC 4.8.1])和Linux(编辑:GCC 4.8) .1)第二次,但两次都在同一台机器上.
在Windows上,它给了我:
Cholesky decomposition in 10114 ms.
但在Linux上,我得到:
Cholesky decomposition in 3258 ms.
这不到Windows所需时间的三分之一.
在Eigen用于实现这种加速的Linux系统上是否有可用的东西?
如果是这样,我如何在Windows上完成相同的操作?
解决方法:
确保您使用的是64位系统.如果情况并非如此,那么不要忘记启用SSE2指令(-msse2),但性能仍然不如64位系统那样高,因为可用的SSE寄存器较少.