[①Intel Intrinsic]: AVX Intrinsic简介

前言

从1976年第1代x86 CPU算起,Intel x86架构下的指令集有着悠久的发展历史,不断进行着革新:从64-bit的MMX,128-bit的SSE,到256-bit的AVX和512-bit的AVX512。本文主要介绍AVX指令,包括了AVX/AVX2,它在兼容SSE指令的同时,也将SSE 128-bit的寄存器拓宽到了256-bit,同时AVX2包括了更多对整型向量数据的操作。
下图是Intel 指令的革新过程跟支持的CPU架构:

下图是与SSE相比AVX指令性能方面的提升:

环境支持

在使用AVX指令之前,要查看当前CPU架构是否支持,可以用以下命令查看:

cat /proc/cpuinfo
或
cat /proc/cpuinfo | grep avx

在flags中查看是否有avx的标识。
在边编写代码中要引入头文件<immintrin.h>。

AVX Intrinsic 检索

关于AVX Intrinsic和历代的指令都能在Intel的官网中找到:https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html
例如_mm256_abs_epi16这个指令:

其中体现了输入输出,说明,伪代码和在不同CPU架构下的性能(latency和throughput)。

寄存器,数据类型和函数名称

AVX硬件拥有16个256-bit YMM寄存器(YMM0~YMM15)。所使用数据类型如下:

  • __mm128 - 包含4个32-bit float 类型数据向量
  • __mm128d - 包含2个64-bit double 类型数据向量
  • __mm128i - 包含数个整型数据向量(共128-bit)
  • __mm256 - 包含8个32-bit float 类型数据向量
  • __mm256d - 包含4个64-bit double 类型数据向量
  • __mm256i - 包含数个整型数据向量(共256-bit)

AVX指令的函数名称一般采取下面的命名规则:

<return data type> __mm<bit width>_<name>_<data type>
  • bit width - 从这里的比特位宽就能看出这条指令操作的数据向量的比特长度。
  • name - 从函数的名称中就能大致猜出这条指令做了什么,如add,shuffle等,又比如上例中的abs,就可以看出这条是取绝对值的指令。
  • data type - AVX的data type有:
    ps (32-bit float 类型,把32 bits 看成一个整体)
    pd(64-bit double 类型)
    epi8/epi16/epi32/epi64 (整型数据,分别代表一个整型有8-bit/16-bit/32-bit/64-bit)
    epu8/epu16/epu32/epu64 (无符号整型数据,分别代表一个整型有8-bit/16-bit/32-bit/64-bit)
    si128/si256 (不关心数据向量里是什么数据类型,反正是128-bit/256-bit看成整体操作)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李71~李先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值