单数据多指令 SIMD MMX SSE AVX

               

概述

SIMD是指单指令多数据技术,它已经成为Intel处理器的重要性能扩展。目前Intel处理器支持的SIMD技术包括MMX,SSE,AVX.
MMX提供了8个64bit的寄存器进行SIMD操作,SSE系列提供了128bit的8个寄存器进行SIMD指令操作。而最新的AVX指令则支持256bit的SIMD操作。
目前SIMD指令可以有四种方法进行使用分别是汇编语言,C++类,编译器Intrisincs和自动矢量化。

MMX

MMX是由英特尔开发的一种SIMD多媒体指令集,共有57条指令。它于1996年集成在英特尔奔腾 (Pentium) MMX处理器上,以提高其多媒体数据的处理能力。 MMX是Intel命名的矩阵数学扩展(Matrix Math eXtensions).MMX寄存器,称作MM0到MM7,实际上就是处理器内部80比特字长的浮点寄存器栈st(0)到st(7)的尾数部分(64比特长)的复用。由于浮点栈寄存器的高16位未被MMX技术使用,因此这16位都置为1,因此从栈寄存器的角度看,其浮点值为NaN或Infinities,这可用于区分寄存器是处于浮点栈状态还是MMX状态. 作为MMX寄存器都是直接访问。利用了装配数据类型(packed data type)的概念,每个MMX寄存器的64比特字长可以看作是2个32位整数、或者4个16位整数、或者8个8位整数,从而可以执行整数SIMD运算。这对于1990年代中期的2D、3D计算的加速还是很有意义的,因为当时的计算机的图形处理器(GPU)还很不发达。但现在MMX整数SIMD运算对于图形运算来说是多余的技术了。不过MMX的饱和算术运算(saturation arithmetic operations)对于一些数字信号处理应用还是有用的。

 

SSE(Streaming SIMD Extensions)

英特尔AMD3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是继MMX的扩充指令集。SSE 指令集提供了 70 条新指令。AMD后来在Athlon XP中加入了对这个新指令集的支持。SSE 加入新的 8 个 128 位元暂存器(XMM0~XMM7)。 由于 SSE 加入了浮点支持,SSE 就比 MMX 更加常用。而 SSE2 加入了整数运算支援之后让 SSE 更加的有弹性,当 MMX 变成是多余的指令集,SSE 指令集甚至可以与 MMX 并行运作,在某些时候可以提供额外的性能增进。

AVX

AVX(Advanced Vector Extensions) 是Intel的SSE延伸架构,如IA16至IA32般的把暂存器XMM 128bit提升至YMM 256bit,以增加一倍的运算效率。此架构支持了三运算指令(3-Operand Instructions),减少在编码上需要先复制才能运算的动作。在微码部分使用了LES LDS这两少用的指令作为延伸指令Prefix。目前Apple OS X 10.6.8(雪豹的更新版本)及更高,Linux 2.6.30 内核以后,以及Windows 7 SP1(Service Pack 1) KB976932,Windows Server 2008 RC2 SP1 与 Windows 8 支援AVX,Windows XP应该不支援

FMA

  • FMAIntel的AVX扩充指令集,如名称上熔合乘法累积(Fused Multiply Accumulate)的意思一样。

SIMD数据类型简介

  SIMD数据类型有——
__m64:64位紧缩整数(MMX)。
__m128:128位紧缩单精度(SSE)。
__m128d:128位紧缩双精度(SSE2)。
__m128i:128位紧缩整数(SSE2)。
__m256:256位紧缩单精度(AVX)。
__m256d:256位紧缩双精度(AVX)。
__m256i:256位紧缩整数(AVX)。
注:紧缩整数包括了8位、16位、32位、64位的带符号和无符号整数。

  这些数据类型与寄存器的对应关系为——
64位MM寄存器(MM0~MM7):__m64。
128位SSE寄存器(XMM0~XMM15):__m128、__m128d、__m128i。
256位AVX寄存器(YMM0~YMM15):__m256、__m256d、__m256i。

           

猜你喜欢

转载自blog.csdn.net/qq_44906416/article/details/89247616
今日推荐