c – 为什么Eigen的Cholesky在Linux上的分解比在Windows上快得多?

我注意到使用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寄存器较少.

上一篇:c-从本征序列化分解矩阵(SparseLU对象)


下一篇:c – 使用特征矩阵构建3D结构的最有效选项