为什么库需要硬编码矢量化而不是编译器自动矢量化
Why do libraries need hard coded vectorizion instead of compiler auto vectorization
C++ eigen 库对不同的体系结构进行矢量化,如 SSE、NEON 等。在他们的文档中他们提到,Eigen 向量化不依赖于编译器。但是如果使用 -O3 标志启用矢量化标志,大多数现代编译器(如 gcc)会自动进行矢量化。
所以我的问题是,为什么 Eigen 或任何其他库在编译器自动为我们执行硬编码矢量化时执行此操作?
编译器在自动矢量化方面确实越来越好,对于像 2*A-4*B 这样的基本系数运算,像 Eigen 这样的库不能比最近的编译器做得更好。然而,对于矩阵乘积、约简、转置、幂等稍微复杂的表达式,编译器无能为力。另一方面,Eigen 可以利用表达语义的更高层次的知识来显式地向量化它们。此外,复杂的标量类型不会被编译器矢量化。您可以通过禁用 Eigen 的显式矢量化来自行检查(-DEIGEN_DONT_VECTORIZE)。
C++ eigen 库对不同的体系结构进行矢量化,如 SSE、NEON 等。在他们的文档中他们提到,Eigen 向量化不依赖于编译器。但是如果使用 -O3 标志启用矢量化标志,大多数现代编译器(如 gcc)会自动进行矢量化。
所以我的问题是,为什么 Eigen 或任何其他库在编译器自动为我们执行硬编码矢量化时执行此操作?
编译器在自动矢量化方面确实越来越好,对于像 2*A-4*B 这样的基本系数运算,像 Eigen 这样的库不能比最近的编译器做得更好。然而,对于矩阵乘积、约简、转置、幂等稍微复杂的表达式,编译器无能为力。另一方面,Eigen 可以利用表达语义的更高层次的知识来显式地向量化它们。此外,复杂的标量类型不会被编译器矢量化。您可以通过禁用 Eigen 的显式矢量化来自行检查(-DEIGEN_DONT_VECTORIZE)。