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

Why is Eigen's Cholesky decomposition much faster on Linux than on Windows?

本文关键字:Linux Windows 快得多 分解 Eigen Cholesky 为什么      更新时间:2023-10-16

我注意到使用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, [edit: GCC 4.8.1]),第二次在Linux上运行(edit: 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寄存器较少。

查看Eigen的主页。

<标题> "

Eigen在以下编译器中成功使用:

GCC, 4.1及以上版本。GCC 4.2的性能非常好和更新。

MSVC (Visual Studio), 2008及更新版本(旧的2.xEigen的版本支持MSVC 2005,但没有矢量化)。

Intel c++编译器。非常好的表现。

LLVM/clang++(2.8及更新版本)。

MinGW,最新版本。很好使用GCC 4时的性能。

QNX的QCC编译器

<标题>参数

您可能使用比您的MinGW版本更新的gcc (>=4.2)版本…

<标题>注意

作为旁注,您甚至可能有一个不是"最近"的MinGW版本,正如链接中所说:

特征是标准的c++ 98,因此理论上应该兼容任何兼容的编译器。当我们使用一些非标准功能时,这是可选的,并且可以禁用。

因此,也许您的gcc版本使用了MinGW不具备的新的优化特性,并退回到另一个更慢的替代方案。

当然,最后,它可能是一个完全不同的东西,这是一个基于理论的实验猜测…