为什么Eigen的Cholesky在我的Ubuntu上分解得很慢

时间:2016-02-14 15:34:54

标签: c++ eigen3

我在核心i5机器上使用Ubuntu 14.04。以下代码在不同的计算机上进行了测试,运行时间非常快(3258毫秒),但在我的系统上需要112921毫秒。我使用g ++作为编译器。

#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;

}

2 个答案:

答案 0 :(得分:0)

我假设你在没有优化的情况下在调试模式下进行编译。

如果您使用的是CMake,请使用cmake -DCMAKE_BUILD_TYPE=Releasecmake -DCMAKE_BUILD_TYPE=ReleaseWithDebugInfo进行构建。否则,尝试将优化标志-O3添加到g ++编译器。

答案 1 :(得分:0)

当您在调试模式下编译程序时(例如g++ -std=c++11),很多事情都会发生在幕后。回想一下发生崩溃时可以看到的信息。所有这些信息和管家都需要时间。

因此,当您的程序经过测试并且工作正常时,您不再需要内务管理,您希望性能发挥作用。

使用optimization flags,例如O1,O2或O3(there are more)。哪一个使用? 重度取决于您的应用程序,因此请至少尝试这三个选项。

注意:请确保使用大写的Omikron,否则(如果键入小写的omikron或零),您会认为编译了启用了优化的代码,但它仍然会在调试模式下编译。

采购Gcc tutorial

为gdb和许多警告消息生成符号信息。

g++ -g -Wall myprog.C -o myprog

在具有警告的Solaris计算机上生成优化代码。 -O是大写o而不是数字0!

g++ -Wall -O1 -mv8 myprog.C -o myprog