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

时间:2014-05-07 16:45:30

标签: 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;
}

我使用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上完成同样的工作?

2 个答案:

答案 0 :(得分:5)

确保使用的是64位系统。如果情况并非如此,那么不要忘记启用SSE2指令(-msse2),但性能仍然不如64位系统那样高,因为可用的SSE寄存器更少。 / p>

答案 1 :(得分:2)

见Eigen的主页here

引用

  

Eigen正在成功地与以下编译器一起使用:
  
GCC,4.1及更新版本。 GCC 4.2的性能非常好   更新。

MSVC(Visual Studio),2008及更新版本(旧版2.x.   版本的Eigen支持MSVC 2005,但没有矢量化)。
  
英特尔C ++编译器。非常好的表现。

LLVM / CLang ++   (2.8及更新)。

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

QNX的QCC编译器。

参数

您的gcc(&gt; = 4.2)版本可能比MinGW使用的版本更新...

注意

就像旁注一样,你甚至可能有一个不是“最近”的MinGW版本,因为链接也说:

  

Eigen是标准的C ++ 98,理论上应该兼容   任何兼容的编译器   每当我们使用一些非标准功能时,这是可选的,也可以   禁用。

所以也许你的gcc版本使用了一个新的优化功能,MinGW没有,并且又回到了另一个更慢的替代方案。

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