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

Cal*_*ior 5 c++ linux performance eigen

我注意到使用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;
}
Run Code Online (Sandbox Code Playgroud)

我使用此基准进行编译,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.
Run Code Online (Sandbox Code Playgroud)

但是在Linux上我得到:

Cholesky decomposition in 3258 ms.
Run Code Online (Sandbox Code Playgroud)

这不到Windows所需时间的三分之一。

Eigen在Linux系统上是否有可用的工具来实现这种加速?
如果是这样,我如何在Windows上完成相同的工作?

gga*_*ael 5

确保您使用的是64位系统。如果不是这种情况,请不要忘记启用SSE2指令(-msse2),但由于可用的SSE寄存器较少,因此性能仍然不如64位系统。

  • 而已。我完全忘记了,我的MinGW编译器生成32位代码,而Linux上的`g ++`生成本机64位可执行文件。使用MinGW-64项目的编译器来编译64位Windows二进制文件,可以获得与Linux上相同的计时结果。您对SSE的提示也是如此,无论如何,将其启用为32位二进制文​​件都可以将执行速度提高到6.8秒(相比之下为10.1 s)。 (2认同)