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

我编译一个简单的测试程序用于测试gcc自动向量化使用的是何种指令集。
测试程序如下

for(long long i = 0;i < N;++i){
//测试程序应尽可能的增加浮点运算的次数,减少访存的次数。这样会使向量化之后比较结果更加明显。测试代码的代码平衡值Bc=3/8
                C[i]=A[i]*B[i]*0.005+A[i]*0.05+C[i]*0.4+B[i]*0.33;
        }

编译参数(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
  4. 编译器自动向量化似乎无法实现使用avx512指令集进行向量化,我做过一个测试,在skylake架构为CPU上使用-march=native或者-march=skylake-avx512 后发现编译器依旧使用256位的向量进行优化,具体原因未知。详细介绍如下:问答:如何让gcc使用avx512进行向量化?

文章中如有错误之处请大家斧正

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值