2

所以我正在考虑将 Eigen 矩阵库用于我正在做的项目(2D 空间模拟器)。我只是继续使用 Eigen::Vector2d 和裸数组分析了一些代码。我注意到在为数组中的元素赋值方面提高了 10 倍,在计算点积方面提高了 40 倍。

如果您想查看它,这是我的分析,基本上它是 ~4.065s 对 ~0.110s。

显然,裸数组在点积和分配内容方面效率更高。那么为什么要使用 Eigen 库(或任何其他库,Eigen 似乎是最快的)?是稳定性吗?自己难以高效编码的复杂数学?

4

3 回答 3

3

这些库的真正胜利是内置的 SIMD 矢量化。

看起来 eigen 默认情况下不启用它,您需要使用定义/编译器开关启用它。(编辑:误读链接,如果它检测到编译器支持它,它就会启用,并且您需要在某些编译器上启用指令,仍然,可能会或可能不会在您的编译器上默认启用)

(更不用说它们通常比家庭推出的解决方案经过更彻底的测试,并且可以实现各种复杂/有趣的东西,这些东西真的很难手工编码)

于 2012-12-12T04:45:21.227 回答
1

选择标准库代码的原因有很多。

  • 更好的便携性。单个开发人员可能没有考虑(或可能无法访问)多个平台。
  • 更好的可靠性。(正如 Donnie 所提到的)图书馆通常经过更彻底的测试。
  • 更好的开发人员流动性。如果他们使用标准库组件,则处理其他人的代码会更容易。
  • 避免重新发明轮子。您希望避免每个开发人员以自己的方式开发相同组件的情况。
  • 自定义实现很快就会过时。只有在有限的时间内,您才能不断更新和支持您的库版本。标准库可能会有更多的支持工作。
  • 更好的“外部”支持。以 C++ STL 库为例。您会从非原始开发人员那里找到大量资源。此外,教科书将涵盖标准库组件,这有助于新用户和学生学习它们,而不会给开发人员带来任何负担。

PS/免责声明:抱歉,我不知道 Eigen 库。以上几点是从关于标准库的更一般的角度来看的。

于 2012-12-12T04:52:18.793 回答
1

我刚刚查看了您的基准测试并得到以下结果:

g++ -I/usr/include/eigen3/ eigen.cpp -o eigen
g++ -O3 -I/usr/include/eigen3/ eigen.cpp -o eigen_opt
g++ -I/usr/include/eigen3/ matrix.cpp -o matrix
g++ -O3 -I/usr/include/eigen3/ matrix.cpp -o matrix_opt

./eigen  3.10s user 0.00s system 99% cpu 3.112 total
./eigen_opt  0.00s user 0.00s system 0% cpu 0.001 total
./matrix  0.06s user 0.00s system 96% cpu 0.058 total
./matrix_opt  0.00s user 0.00s system 0% cpu 0.001 total

除非您打开编译器优化,否则 Eigen 确实不快。我还怀疑该-O3案例中的编译器做了一些不利于基准测试的优化。你可能想调查一下。

我认为这消除了您不使用库的要点之一:速度。一旦该标准被排除在外,我就没有理由不使用现有的图书馆,除非你想为学术目的做点什么,或者你想编写自己的图书馆。这些天,每当我看到实现自己的 Matrix 和 Vector 类的库或其他代码时,我都会尽可能避免使用它。有了Eigen,我什至对Matlab的需求要低得多......

于 2012-12-12T10:09:39.937 回答