为啥库需要硬编码矢量化而不是编译器自动矢量化

Posted

技术标签:

【中文标题】为啥库需要硬编码矢量化而不是编译器自动矢量化【英文标题】:Why do libraries need hard coded vectorizion instead of compiler auto vectorization为什么库需要硬编码矢量化而不是编译器自动矢量化 【发布时间】:2016-07-07 16:20:52 【问题描述】:

C++ eigen 库为不同的架构进行向量化,如 SSE、NEON 等。在他们的文档中,他们提到,Eigen 向量化不依赖于编译器。但是如果使用 -O3 标志启用矢量化标志,大多数现代编译器(如 gcc)会自动进行矢量化。

所以我的问题是,为什么 Eigen 或任何其他库会在编译器自动为我们执行硬编码矢量化时执行此操作?

【问题讨论】:

也许他们不像你那样信任编译器。或者,正如您自己所说,“像 gcc 这样的大多数现代编译器会自动进行矢量化”——也许大多数还不够好。 该库已经存在很长时间了,2.0 版本从 2009 年初开始,并且已经使用了 SSE2 代码。那时编译器还没有。 如果您检查源代码,您会发现其中有很多内容无法自动矢量化。 【参考方案1】:

编译器在自动向量化方面确实越来越好,对于像 2*A-4*B 这样的基本系数运算,像 Eigen 这样的库不能比最近的编译器做得更好。然而,对于稍微复杂的表达式,如矩阵乘积、归约、转置、幂等,编译器无法做太多事情。另一方面,Eigen 可以利用表达式语义的高级知识来显式地向量化它们。此外,复杂的标量类型不会被编译器向量化。您可以通过禁用 Eigen 的显式矢量化 (-DEIGEN_DONT_VECTORIZE) 自行检查。

【讨论】:

以上是关于为啥库需要硬编码矢量化而不是编译器自动矢量化的主要内容,如果未能解决你的问题,请参考以下文章

当我使用日期类型变量而不是硬编码日期时,为啥会出现“操作数类型冲突:日期与 int 不兼容”错误?

从硬编码数组而不是 DB 创建游标

“字节码”而不是硬编码着色器性能

Nvidia NVENC 硬编码预研总结

本机 MongoDB:为啥我的 switch 语句不能使用字段名称,而只能使用硬编码值?

有没有办法从多个 URL 生成 Web 查询,而无需在 Excel 中对值进行硬编码?