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