编译器实现向量化默认使用的是哪个指令集?

我编译一个简单的测试程序用于测试gcc自动向量化使用的是何种指令集,当编译参数(CFLAGS)为

-O1   -ftree-vectorize  -fopt-info-vec-optimized
#参数解释  
#-O1:编译器使用O1级优化,此优化等级不会对代码运行性能产生任何优化。
#-ftree-vectorize :启用编译器向量化选项,编译器会自动进行向量化。
#-fopt-info-vec-optimized :让编译器报告向量化的优化信息。

编译器提示如下

gccvectortest.c:16:13: optimized: loop vectorized using 16 byte vectors

由此可以看出编译器默认使用的是128位的向量(SSE指令集),因为编译器编译过程中默认不会针对某一个CPU架构进行特殊的优化,而是采取相对保守的策略,所以此处使用的应该是绝大多数CPU都支持的SSE指令集。
若想让编译器为特定CPU进行优化(主要是向量化)可以通过-march=xxx,其中xxx指的是和CPU架构相关的代号,可选值如下

nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 cannonlake icelake-client icelake-server cascadelake bonnell atom silvermont slm goldmont goldmont-plus tremont knl knm x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 znver2 btver1 btver2 native

其中-march=native可使编译器自动识别CPU架构并有针对性的生成优化代码。
比如我想令编译器使用avx2指令集进行向量化,则可有如下设置

#前提是当前CPU支持avx2指令集
-O1  -ftree-vectorize  -fopt-info-vec-optimized -march=native
或者
-O1  -ftree-vectorize  -fopt-info-vec-optimized -march=core-avx2

编译后编译器提示如下

gccvectortest.c:16:13: optimized: loop vectorized using 32 byte vectors
gccvectortest.c:10:5: optimized: loop vectorized using 32 byte vectors

由此可以看出编译器使用的是256位的向量(AVX指令集)
其他相关的介绍:
  1. O3级别的优化自动开启-ftree-vectorize
  2. 编译器实现向量化的能力有限,面对循环体内部稍微复杂时编译器则无法实现向量化,只能手动实现。
  3. 手动实现向量化可通过调用intel内部函数实现,具体函数可参考如下链接:Intel intrinsics-guide 编译时需要根据使用的指令集添加对应的编译选项如使用avx指令集则需要添加 -mavx
上一篇:vim自动添加tags、cscope


下一篇:windows使用记录---2019.8月补丁更新后出现windows7系列UEFI无法启动解决办法