为什么要使用第三方矢量库?

时间:2012-12-12 04:29:13

标签: c++ arrays eigen

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

如果你想查看它,这里是my profiling,基本上它是~4.065s对抗~0.110s。

显然裸阵列在点积和分配东西方面效率更高。那么为什么要使用Eigen库(或任何其他库,Eigen看起来最快)?它稳定吗?难以自己编码的复杂数学?

3 个答案:

答案 0 :(得分:3)

这些图书馆真正的胜利是内置的SIMD矢量化。

默认情况下,eigen看起来没有启用,你需要enable it使用define / compiler开关。 (编辑:误读链接,如果它检测到编译器支持它,则启用它,并且您需要启用某些编译器上的指令,默认情况下,可能在编译器上启用,也可能不启用)

(更不用说它们通常比家用滚动解决方案经过更彻底的测试,并且能够实现各种复杂/有趣的东西,这些都是真正的手工编写代码)

答案 1 :(得分:1)

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

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

答案 2 :(得分: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的需求甚至更低......