一、发展背景
1993年,Intel公司推出了奔腾处理器,该类型处理器拥有两条执行流水线,和当时的处理器相比,可以同时执行两条指令,实现超标量性能。1996年,P6系列处理器中的奔腾II处理器引入了英特尔MMX技术,这是是最早的SIMD扩展指令。后续又相继推出了SSE、SSE2、SSE3、SSSE3和SSE4指令。2008年,Intel公司宣布将推出全新的Sandy Bridge微架构,并将引入AVX指令集。此后,Intel公司相继推出了AVX2和AVX512指令集扩展。
二、指令基础
MMX技术定义了一种简单灵活的SIMD执行模型,可以用来处理64位的打包数据,该模型为IA-32架构增加了以下功能,同时保持与所有IA-32应用程序和操作系统代码的向后兼容性:
- 64位的MMX寄存器,分为64位访问模式和32位访问模式
- MMX寄存器支持存放8位、16位和32位整型元素
- MMX指令集
- CPIID指令的扩展
SSE扩展增强了SIMD执行模型,主要是通过增加了128位的XMM寄存器,实现支持128位的向量处理能力。高级矢量扩展(AVX)在XMM寄存器基础上将寄存器扩展到256位,引入了256位的向量处理能力。AVX指令集接口直接映射到AVX指令集和其他的增强的128位单指令多数据指令。AVX指令在架构上和SSE系列指令相似,不过AVX提供了超越前几代128位SIMD扩展的若干增强特性,主要包括下面几点:
- 支持256位宽的向量和SIMD寄存器集
- 支持三到四个操作数的语法以提高新指令的灵活性和效率
- 加强了传统的128位指令以支持三个操作数的语法和简化高级语言表达式的编译器向量化
- 指令的编码格式使用新前缀以便于提供紧凑高效的编码
- 支持一个寄存器最多存放32个元素
大多数的AVX指令的命名格式如下所示:
命名中的各个条目说明如下:
三、寄存器简介
MMX指令使用的是64位MMX寄存器,如下图所示:
SSE扩展中新增的XMM寄存器如下所示:
AVX包含16个256位宽的YMM寄存器(YMM0-YMM15)YMM寄存器的低128位可称为XMM寄存器。寄存器的结构如下图所示:
AVX扩展中的寄存器使用三种C语言类型的数据结构作为操作数的类型,如下所示:
- __m256:表示寄存器存放的是32位的单精度浮点数
- __m256d:表示寄存器存放的是64位的双精度浮点数
- __mm256i:表示寄存器存放的是整数类型,支持8位、16位、32位和64位
四、指令用法
除了常见的加法、减法和乘法等算术运算,AVX还支持很多其他指令,包括位运算指令、比较指令、加载存储指令、类型转换指令等。这里取部分难懂的指令说明其用法。
shuffle系列指令的一种格式是_mm256_shuffle_epi8,该指令语法如下图所示:
具体功能是将寄存器按照128位分区,对分区内的元素按照索引进行重排,图示如下:
permute系列指令的一种格式是_mm256_permute4x64_epi64,指令语法如下图所示:
实现的功能是根据imm8将新向量赋值。
broadcast系列指令的一种格式是_mm_broadcastb_epi8,指令语法如下图所示:
功能是将输入向量最低位赋值到输出向量,如下图所示:
blend系列指令的一种格式是_mm256_blendv_epi8,指令语法如下图所示:
功能是按照mask元素最高位的0或1标签将a或b中的元素填充到输出向量中,如下图所示:
gather系列指令的一种格式是_mm256_i32gather_epi64,指令语法如下图所示:
功能是按照索引向量从指定地址加载数据,scale指定值范围是1、2、4、8。功能图如下所示:
以上就是intel指令集中较为复杂的指令的简单介绍,详细使用可参见官网相关文档。
五、总结
Intel指令集的方便之处就是可在Windows平台验证,借用VS即可验证每个指令的功能。本文档只是简单介绍其发展和基本指令。