我注意到使用 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上完成同样的工作?
答案 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没有,并且又回到了另一个更慢的替代方案。
当然,最后,它可能是一个完全不同的东西,这是基于理论的实验性猜测...