AVX指令集作用和应用介绍 AVX指令集是什么

很多读者朋友可能在阅读我们的文章时经常会看到AVX指令集这个名词,比如说在CPU评测中就往往能够看到它的身影,一些新入坑的玩家可能会不明白这个名词的含义,今天这篇文章就简单介绍一下该指令集的来龙去脉,并且梳理一下它目前在实际中的应用情况 。
从SIMD说起要搞明白AVX指令集的作用,首先要讲明白它是什么 。定义很简单,它就是x86处理器上面的一套SIMD指令集,是经典的SSE系列指令集的直接继承者 。那么SIMD又是什么呢?
在计算机刚刚出现的早期阶段,冯·诺伊曼式计算机每次输入一个指令只能够操作一对数据,比如说\”+,a,b\”可以让ab进行相加,这就是单指令流单数据流(Single Instruction Stream, Single Data Stream) 。显然,在面对大量数据的时候,这种操作数据的方法效率较低,程序员想要让一次操作就对多组数据生效,怎么办呢?单指令流多数据流操作(Single Instruction Stream, Multiple Data Stream)的思路就被引入了,它让输入一次指令就操作多组数据变成了可能 。

AVX指令集作用和应用介绍 AVX指令集是什么

文章插图

更直观的区别可以看上面的示意图 。
上世纪八九十年代,很多处理器开发商都意识到了SIMD的前景,他们开始往自家的处理器里加入SIMD支持 。1996年,Intel发布了基于新版P55C架构(最早一版Pentium处理器为P5架构)的Pentium MMX系列处理器,其中引入了新的MMX指令集,开始支持SIMD 。
AVX指令集作用和应用介绍 AVX指令集是什么

文章插图

从MMX到SSE,再到AVXPentium MMX系列处理器上新引入的MMX指令集开创了x86处理器支持SIMD操作的先河,该指令集定义了8个64-bit宽度的寄存器,每个寄存器的64-bit容量中可以放入八个8-bit长度的整数或四个16-bit长度整数或两个32-bit整数,CPU在识别到MMX指令集的新指令时会自动将寄存器中的数据进行分割计算,这样一来,单个指令就成功操作了多个数据,实现了SIMD 。
但MMX毕竟太嫩,它实际上是通过复用CPU内部x87浮点单元的寄存器来实现SIMD的,所以与运行浮点运算的x87指令集有冲突,两者不能交叉使用,必须先进行切换 。另外,由于上述的冲突,它只支持整数操作,在即将要到来的3D时代中显得有些不够用 。
Intel当然很清楚MMX指令集的局限之处,而竞争对手新捣鼓出来的3DNow!指令集(1998年,AMD K6-2)已经支持了浮点SIMD运算,于是他们赶紧在经典的奔3处理器上面引入了新的SSE(Streaming SIMD Extensions)指令集,时间点为1999年2月份 。
SSE指令集解决了MMX指令集身上存在的两大问题,通过引入新的独立寄存器解决了与浮点运算间的冲突问题,同时也就支持了浮点SIMD运算 。当然它相对于MMX有很大加强,表现在它的寄存器宽度随着处理器架构的进步而达到了128-bit,这样一来一次SIMD指令能够操作更多的数据,效率上有大幅度的提高 。不过初代SSE指令集的单个寄存器只支持32-bit长度的浮点数,还是有很大的局限性,这个问题在Pentium 4(Willamette,2000年)上面引入的SSE2中被解决了,SIMD操作的灵活度高了很多 。
随后在约莫8年的时间里,Intel一直在更新SSE指令集,从SSE出到SSE4,AMD方面则是一直在跟进,到了SSE4.2,AMD开始想要在指令集上面寻找自己的翻身点,于是推出了只有自家支持的SSE4a子集,随后更是提前于Intel提出了SSE5 。
但Intel不干,我是x86的老大,我不能跟着你来 。他们另起炉灶,准备在未来的Sandy Bridge架构中引入一套新的SIMD指令集,这套新指令集在2008年公布,被命名为高级向量扩展(Advanced Vector Extensions) 。
革新的AVX,越来越宽的寄存器相比起迭代了多年的SSE系列指令集,AVX指令集带来了巨大的革新,其中最为主要的是,它在兼容SSE指令集性的同时,将SSE时代最大宽度为128-bit的寄存器拓宽到了256-bit 。
不过初代AVX指令集还是比较保守的,它没有将所有指令宽度拓宽到256-bit,而是选择停留在128-bit上面 。全面进入256-bit时代这个任务,还是交给了随后的Haswell架构来完成(2013年6月份) 。
AVX指令集作用和应用介绍 AVX指令集是什么

文章插图

同处理器用不同指令集的能效对比
但如果以为Intel会就此停下脚步的话,那就大错特错了,他们很快捣鼓出了更宽的AVX-512指令集,顾名思义,其寄存器宽度再次加倍,来到512-bit 。
首个支持AVX-512指令集的处理器其实是Intel的Xeon Phi加速卡,首次跑到CPU上已经是Skylake-X系列了 。而AVX-512也并不再是一个单一的指令集,它实际上指代的是多个指令集的集合,目前这个数字是17,之后可能还会增多 。所有支持AVX-512的处理器都必须支持AVX-512 Foundation子集,从命名上也可以看出,它其实是AVX-512指令集的基础 。

推荐阅读