有关公司采用SIMD指令的报告一,什么是SIMD指令SIMD即单指令多数据操作,一般用于大型计算机的并行计算。二,Intel的SIMD技术Intel在1993年针对多媒体处理中大量反复的计算过程,将SIMD的思路引入了其处理器,采用特殊指令,实现了采用一条指令在一个时钟周期内对多个数据进行处理,从Pentium处理器开始到目前为止,共提出了四个扩展指令集:MMX,SSE,SSE2,SSE3。Intel的Hyper-Thread(HT)技术也属于SIMD技术的组成部分。各个扩展指令集不仅提供了对图像处理,视频处理,音频处理,通信处理和信号处理运算进行并行计算的指令,减少了计算所使用的时间,还提供了使用户可以直接控制Cache操作的指令,从而在消除CPU与内存之间通信的瓶颈上有着明显的功效。MMX指令集MMX指令集在Pentium和PentiumII处理器中引入,主要针对多媒体流处理运算,对MMX寄存器中的Packedinterger进行操作,这种处理可以有效的用于整数数组的运算。MMX技术没有增加新的寄存器,而是采用了x87FPU的浮点寄存器(ST0,…ST7)(80Bit)的低64位,并将其成为MMX寄存器,在相应的时钟周期内对MMX寄存器中数据进行各种运算,在进行ContentSwitch时,CPU将MMX寄存器等同浮点寄存器进行状态保存和恢复。MMX的核心内容就是并行计算,以WORD(16bit)的加法为例,在相同时钟周期内可以完成4次运算:MMX技术主要提供以下的特点:八个MMX寄存器三种新的数据类型1)64bitpackedbytedata(signed,unsigned)2)64bitpackedworddata(signed,unsigned)3)64bitpackeddoubleworddata(signed,unsigned)支持新数据类型的新指令1)数据传输指令(DataTransferInstruction)MOVQ:可以将64bit的数据一次传输到MMX寄存器中,并在MMX寄存器之间进行数据传输。MOVD:可以将32位数据数据处传输到MMX寄存器的低32bit中,并在MMX寄存器之间进行数据传输。2)算术运算指令(ArithmaticInstruction)a)PADDB,PADDW,PADDD和PSUBB,PSUBW,PSUBD对经过打包的signed和unsigned型的Byte,Word,DoubleWord整数进行Wrapround(存在溢出问题)加法计算。MOVQmm00xFEFEFEFEFEFEFEFE;//mm0(0)=254PADDBmm02;//mm0(0)=1b)PADDSB,PADDSW和PSUBSB,PSUBSW对经过打包的signed型的Byte,Word整数进行饱和(不存在溢出问题)加法运算。MOVQmm00xFEFEFEFEFEFEFEFE;//mm0(0)=0xFEPADDBmm02;//mm0(0)=0xFFc)PADDUSB,PADDUSW和PSUBUSB,PSUBUSW对经过打包的unsigned型的Byte,Word整数进行饱和(不存在溢出问题)加法运算。d)PMULHW和PMULLW打包WORD型数据的乘法运算。与加法运算不同,因为两个WORD相乘,结果是个DWORD,则MMX寄存器明显不够用(4个WORD变为4个DOWRD),因此Intel采用了该方法:一次WORD乘法要进行两次计算,PMULHW获得乘法的高位WORD,PMULLW获得乘法的低位WORD。对于图像处理中的BYTE乘法,MMX没有给出相应的指令,目前的做法是:A*BA7A6A5A4A3A2A1A0B7B6B5B4B3B2B1B0变换(1)为:0A70A60A50A40A30A20A10A00B70B60A50A40B30A20A10A0利用PMULL计算A×B:C7C6C5C4C3C2C1C0变换(2):C7C6C5C4C3C2C1C0由于WORD乘法运算的高8位都为0,则计算得到的DOWRD的高16位也为0,则直接通过PMULL就可以得到计算结果,而由于是BYTE的运算,则结果也必须是BYTE,因此将WORD型结果饱和压缩为BYTE型。e)PMADDWD矢量运算3)打包解包指令(PackInstruction&UnpackInstruction)打包指令对数据存放格式进行各种整合,以用于进一步处理。a)Packed指令PACKUSWB有符号数WORD带饱和压缩成无符号BYTE(packwordintobyteswithunsignedsaturation)PACKSS[WB,DW]有符号数带饱和压缩成有符号数(packword(dword)intobytes(word)withsignedsaturation)PACKUSWBMM0,MM1:即上面的变换(2),在进行压缩(打包)时,饱和操作就是大于255的紧缩后就变成255,小于0的紧缩后就变成0。b)Unpacked指令PUNPCKH[BW,WD,DQ]交错放置两数的高位[byte-word,word-dword,dword-qword]PUNPCKL[BW,WD,DQ]交错放置两数的低位[byte-word,word-dword,dword-qword]PUNPCKHBWMM0,MM1即上面的变换(1),在变换1中MM1中为0。以下是将图像中每一个像素与一个系数相乘的例子:movqmm0,[eax];//eax中存放图像数据低值movqmm1,mm0;//mm0=mm1=A7A6A5A4A3A2A1A0movqmm2,[ebx];//eax中存放乘法系数movqmm3,mm2;//mm2=mm3=B7B6B5B4B3B2B1B0pxormm7,mm7;//mm7=0punpcklbwmm0,mm7;//mm0=0A30A20A10A0punpckhbwmm1,mm7;//mm1=0A70A60A50A4punpcklbwmm2,mm7;//mm2=0B30B20B10B0punpckhbwmm3,mm7;//mm3=0B70B60B50B4pmullwmm2,mm0;//C3C2C1C0pmullwmm3,mm1;//C7C6C5C4packuswbmm2,mm3;//mm2=C7C6C5C4C3C2C1C04)EMMS指令由于MMX寄存器使用了浮点寄存器,因此在MMX代码中不能直接进行浮点数运算。如果要进行浮点运算或者MMX代码结束,必须使用EMMS指令对x87FPU进行置位。5)其他指令:比较指令,PCMPEQ[B,W,D]串等于比较(byte,word,dword)PCMPGT[B,W,D]串大于比较(byte,word,dword)逻辑指令,PAND按位与操作PANDN按位与后再取非操作POR按位或操作PXOR按位异或操作移位指令PSLL[W,D,Q]逻辑左移[word,dword,qword]PSRL[W,D,Q]逻辑右移[word,dword,qword]PSRA[W,D,Q]算术右移[word,dword,qword]SSE指令集SSE在PentiumIII处理器中引入,主要针对3D处理中的浮点数运算,对MMX和XMM寄存器中的Packedsingle-precisionfloat数进行操作,对MMX中的整数进行操作。并且SSE提供了状态控制,Cache控制和内存排序等操作。SSE指令对MMX技术进行了扩展:添加了8个128bit寄存器XMM0-XMM7一个32bit的MXCSR寄存器,用于为XMM中的运算提供控制位和状态。128bit单精度浮点数类型(将IEEE的单精度浮点数打包为一个doublequadword)用于执行浮点数运算和整数运算的SIMD指令:128位的Packed和Scalar单精度浮点数指令,用于进行XMM寄存器运算。Packed和Scalar的区别:1)数据传输指令(DataTransferInstruction)a)MOVAPS:movealignedpackedsingle-precisionfloat-pointdata这里的aligned指如果源操作数在内存中,则该内存的首地址必须是16的倍数(在MMX指令中,必须为4的倍数),否则产生异常错误。在Scalar运算中没有此限制。b)MOVUPS:moveunalignedpackedsingle-precisionfloat-pointdata。c)…SSE的数据传输指令提供了分别移动XMM高位部分和低位部分的指令。2)算术运算指令(ArithmaticInstruction)提供了对于Packed和Scalar浮点数的加减乘除法、倒数、平方根、平方根倒数、昀大昀小值。3)变换指令提供了将packedDWORD整数与packed单精度浮点数之间和DWORD整数与scalar单精度浮点数之间的变换。4)SHUFFLE和Unpack指令SHUFFLE实现了灵活的数据排列操作:UNPCKHPS和UNPCKLPS与MMX指令类似。64位的Packed整数运算扩展指令。SSE没有提出128位的整数指令,即SSE指令集不能用于计算XMM中的整数运算。a)PEXTRW将一个WORD从通用寄存器或者内存中传输到MMX中指定WORD位置。b)PMOVMSKB,将MMX寄存器中每个BYTE的第7位转移到一个通用寄存器中低8位的每一位上。PXORMM7,MM7//MM7设置为零MOVQMM0,[SI]//从内存中读数PCMPEQBMM0,MM7//找零PMOVMSKBEAX,MM0//将8位标志送入到通用寄存器中该指令可以对变长编码运算(DCT运算)进行优化,由于MMX的比较指令只在寄存器中产生结果,而不影响标志位,对于那些需要依赖运算结果而改变程序流程的算法就不太方便,通过使用PMOVMSKB指令,可以很方便将比较的结果传送到通用寄存器中。c)PSADB指令,计算各个数的绝对值的和d)计算两个操作数中各个Byte或者Word平均值,昀大昀小值的指令。e)PSHUFW指令,可以实现源操作数中WORD顺序的任意排列:进行数据预读取(Prefetch),cache控制和控制存储操作数顺序的指令。Prefetch指令可以命令CPU提前将内存数据读取Cache中。MOVNTQ,MOVNTPS指令命令CPU将计算结果直接写入内存中,而避免污染Cache。MASKMOVQ:利用一个Mask将所指定的BYTE直接写入内存中,而避免污染Cache。SFENCE指令:SSE2指令集SSE2在Pentium4和Xeon处理器中引入,对XMM寄存器中的Packeddouble-precisionfloat数进行操作,对MMX和XMM中的整数进行操作。SSE2将在MMX中使用的整数指令扩展到XMM中,并提出了若干新的整数指令和新的Cache控制和内存排序指令。SSE2指令提供如下新特点:新的数据类型4)64bitpackeddoubleworddata(signed,unsigned)128bit的packed双精度浮点数(两个IEEE定义的双精度浮点数)5)128bitBYTE,WORD,DWORD,QWORD型整数支持新数据类型的指令1)Packed和Scalar的双精度浮点数指令将单精度浮点数指令用于双精度浮点数,并提供了两者的转换指令。2)附加的64bit和128bit整数指令a)MOVDQA和MOVDQU:传输aligned和unaligned的doubleword整数b)128bit的加减乘法指令,移位指令打包解包指令c)将数据在MMX和XMM中进行传输的指令。d)PSHUFLW和PSHUFHW将SSE中的PSHUFW指令分为高位操作和低位操作。3)将MMX和SSE中的整数指令扩展到128bit。所有的MMX和SSE中都扩展到128bit的XMM中进行操作,其指令基本相同。4)附加的Cache控制指令和指令顺序控制指令a)CLFULSH:flushca