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

Why use third-party vector libraries at all?

本文关键字:第三方 为什么      更新时间:2023-10-16

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

如果你想看看的话,这是我的评测,基本上是4.065秒对0.110秒。

显然,裸阵列在点积和分配东西方面要高效得多。那么,为什么要使用Eigen库(或者任何其他库,Eigen似乎是最快的)呢?它稳定吗?复杂的数学很难自己有效地编码?

这些库的真正优势是内置SIMD矢量化。

看起来默认情况下,eigen不会启用它,您需要使用define/compiler开关来启用它。(编辑:错误阅读链接,如果它检测到编译器支持它,它就会被启用,并且你需要在一些编译器上启用指令,但在你的编译器上,默认情况下可能会打开,也可能不会打开)

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

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

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

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案例中的编译器进行了一些针对基准测试特性的优化。你可能想调查一下。

我认为这消除了你不使用库的一点:速度。一旦这些标准被排除在外,我就没有理由不使用现有的图书馆,除了你想为学术目的做点什么,或者你想写自己的图书馆。这些天,每当我看到一个库或其他代码实现了自己的矩阵和向量类时,如果可能的话,我都会尽量避免它。有了Eigen,我甚至对Matlab的需求更低。。。