【发布时间】:2014-05-07 16:45:29
【问题描述】:
我注意到使用 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 上完成相同的操作?
【问题讨论】:
-
只是一个想法,但我会研究时钟的精度,两个系统上可能不一样?
-
@jcoder:相差 7 秒。时钟甚至不需要非常准确。
-
你可以使用我的code,而不是使用 Eigen。在我的系统上,分解一个 5790x5790 矩阵需要 1.36 秒。如果 Eigen 的 Cholesky 分解支持 OpenMP(我知道它适用于矩阵乘法),您应该启用 OpenMP 并查看性能如何。很难并行化 Cholesky 分解,但这就是我所做的(对于 MIMD 和 SIMD)。
-
对,对不起,我看错时间了,请忽略我的评论。
标签: c++ linux performance eigen