为什么 Eigen's Cholesky 分解在 Linux 上比在 Windows 上快得多?
Why is Eigen's Cholesky decomposition much faster on Linux than on Windows?
我注意到使用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不具备的新的优化特性,并退回到另一个更慢的替代方案。
当然,最后,它可能是一个完全不同的东西,这是一个基于理论的实验猜测…
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 函数在Windows或Linux上运行时表现不同
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 如何在 Linux for Windows 上通过 MinGW 构建静态 ICU 的 Boost
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 如何在Linux / Windows操作系统上使用文件*.cpp一步编译下面的代码
- 获取块设备 Linux/Windows 的大小
- 奇怪!Linux & Windows VSprintf float num to file
- 在 Linux/Windows 上使用 c++ 的 GUI 应用程序
- C++websockets服务器/客户端跨平台linux/windows
- 交叉编译 linux-->windows:使用 opengl32 获得更新的 OpenGL 支持.dll
- 在没有文件支持的情况下保留共享内存(Linux/Windows) (boost::interprocess)
- 如何在Linux/Windows机器的Android操作系统上运行c++程序
- 链接错误- Oculus Rift lib在Qt和VS2013 (Linux - Windows)
- Linux/windows睡眠时间