SIMD(Single Instruction Multiple Data,单指令多数据)一条指令能处理多个数据,使操作的并行性进一步增强,提高了计算机的多媒体处理能力。
SIMD指令集是开放的,包括MMX、3DNow!、SSE等。
音像、图形、通信、虚拟现实等技术使计算机处理的信息量呈指数级增长,通用CPU一时难以满足要求,于是出现各种专用数字信号处理器(DSP)和由其构成的板卡(音频卡、视频卡、3D图形加速卡、电影回放卡、网络卡等),使主机箱内插卡增多,降低了整机可靠性,有时还会造成地址和中断冲突等。对游戏、音乐合成、语音压缩/解压、图像图形处理、MPEG视频等应用程序分析,它们具有以下一些共同特征。
· 短整数数据类型(像素为8/16位,音频为16位)。
· 频繁的乘与累加,高度重复的小循环体。
· 巨大计算量的算法。
· 高度并行操作。
针对上述分析结果,Intel公司在第五代微处理器中开发了MMX技术。MMX技术借用现成的浮点堆栈生成8个64位MMX寄存器,MMX寄存器支持4种新型数据类型:紧缩字节(8个字节)、紧缩字(4个字)、紧缩双字(两个双字)和四字,可将它们移入MMX寄存器同时完成对多个数据的算术运算和逻辑运算。
MMX指令有57条,包括:算术运算(加、减、乘、除、算术移位和累加)、比较、逻辑操作(与、与非、或、异或)、转换操作(把数据紧缩和拆放)、移位操作、移数(在MMX寄存器之间、MMX寄存器与存储单元之间移入/移出)。这些指令按功能分组如表9-9所示。
表9-9 MMX指令分类
种类 |
助记符 |
操作码字节数 |
主要操作 |
算术 操作 |
PADD<B、W、D> |
3 |
循环加(字节、字、双字) |
PADDS<B、W> |
2 |
有符号饱和加(字节、字) | |
PADDUS <B、W> |
2 |
无符号饱和加(字节、字) | |
PSUB <B、W、D> |
3 |
循环减(字节、字、双字) | |
PSUBS <B、W> |
2 |
有符号饱和减((字节、字) | |
PSUBUS <B、W> |
2 |
无符号饱和减(字节、字) | |
PMULHW |
1 |
紧缩字高位相乘 | |
PMULLW |
1 |
紧缩字低位相乘 | |
PMADDWD |
1 |
紧缩字相乘并结果累加 | |
移位 操作 |
PSIL<W、D、Q> |
6 |
紧缩逻辑左移(字、双字、四字) |
PSRL<W、D、Q> |
6 |
紧缩逻辑右移(字、双字、四字或立即数) | |
PSRA<W、D、Q> |
6 |
紧缩算术右移(字、双字、四字或立即数) | |
比较 |
PCMPEQ<B、W、D> |
3 |
紧缩比较是否相等(字节、字、双字) |
PCMPGT<B、W、D> |
3 |
紧缩比较是否大于(字节、字、双字) | |
逻辑 操作 |
PAND |
1 |
与操作 |
PANDN |
1 |
与非操作 | |
POR |
1 |
或操作 | |
PXOR |
1 |
异或操作 | |
转换 操作 |
PACKUSWB |
1 |
把字压缩成字节(无符号) |
PACKSS<WB、DW> |
2 |
压缩(字变成字节、双字变成字)(有符号) | |
PUNPCKH<BW、WD、DQ> |
3 |
从MMX寄存器中拆放高位(字节、字、双字) | |
PUNPCKL<BW、WD、DQ> |
3 |
从MMX寄存器中拆放低位(字节、字、双字) | |
移数 |
MOV<D、Q> |
4 |
从MMX寄存器中移入/移出(双字、四字) |
状态 |
EMMS |
1 |
MMX状态清除 |
注:指令助记符后尖括号内的字母表示该指令支持的数据类型,B—字节,W—字,D—对字,Q—四字。
针对MMX浮点运算的不足,AMD公司在MMX技术基础上设计了3DNow!指令来改善浮点运算,以适应需要大量单精度浮点运算的3D图像处理。
3DNow!将原先的64位MMX寄存器加以延伸,改造成8组3D运算寄存器(充分利用浮点堆栈80位宽度),使其可以拆成两个32位浮点数,具备24位单精度。3DNow!在MMX基础上增加了21条新的多媒体处理指令,包括一条快速进入/退出多媒体执行状态指令、一条数据预取指令、两条数据格式转换指令、两条整数运算指令和15条单精度浮点运算指令。
采用3DNow!技术在最优化的程序执行状态下,处理器在一个时钟周期内可处理4个浮点运算,在几个时钟周期内可完成8组16个浮点数的累乘和累加,浮点运算速度比80x87快几倍到几十倍。不采用3DNow!技术的同档CPU每个时钟周期最多只能执行一次浮点运算。3DNow!指令和MMX指令具有互补性,可混合使用,提升系统的多媒体性能。
3DNow!指令集只支持IEEE 754中单精度数据类型,不能实现双精度浮点运算。
Intel在Pentium III中集成了SSE(Streeming SIMD Extension,单指令多数据扩展流)指令集。SSE技术在微处理器中增加了8个128位浮点寄存器,支持双精度浮点运算。SSE指令集拓展3DNow!新设计了70条指令,包括8条连续内存数据流优化处理指令、50条SIMD浮点运算指令和12条新的多媒体指令。SSE技术极大地满足了三维动画、动态音像、实时通信等流媒体应用的需要。
需求推动技术的发展,互联网的普及使对海量数据流的处理提出了更高的要求,3DNow!之后AMD又推出了增强型3DNow!指令集,Intel在Pentium 4微处理器中又集成了功能更为强大的SSE2指令集(144条)。这些新的SIMD指令集使CPU在进行重复运算时获得了更高的效率。终于,Intel第一款支持超线程(Hyper-Threading)技术的Pentium 4(主频3.06GHz)在2002年11月4日问世,使一个微处理器当作两个甚至多个CPU来使用,在线程级上实现并行操作。之后,双/多核处理器问世,实现了更多线程的并行操作。