标题：MMX技术
基本介绍
MMX技术是在CPU中加入了特地为视频信号(Video Signal)，音频信号(Audio Signal)以及图像处理 (Graphical Manipulation)而设计的一套基本的、通用的整数指令、单指令、多数据（SIMD）技术，可简便地应用于各种多媒体及通信应用程序。[1]
发展历程
1996年3月5日Intel公司首先对外公布了MMX技术，它是由设在以色列海法的Intel实验室完成的。[2]
1997年1月9日Intel公司对外正式推出含有MMX技术，具有多媒体扩充指令集的多能奔腾处理器P55C。[3]
1997年5月Intel又进一步推出了具有MMX技术的P6奔腾芯片，主频可达300MHz的Pentium Ⅱ300，进一步提高了性能。对计算机市场产生了较大的影响，尤其是对多媒体计算机市场，一些PC机厂家认为MMX技术会对多媒体硬件支撑平台带来根本的变化，纷纷推出基于P55C和P6的多媒体计算机。有些厂家认为MMX技术是解决电脑、电信和家电三电一体化的较好的方案，因此积极投入人力和物力研制开发三电一体化的新产品，而另一些多媒体板级产品的厂家出在利用MMX技术设计制造新的多媒体板级产品以适应市场的需要。[4]
设计思想
为了改善Intel体系结构（Intel Architecture，简称IA）的多媒体和通信性能以及适应其数字信号处理的应用，Intel公司采用MMX技术扩充IA。为了保持和扩大Intel公司已有CPU芯片的国际市场，MMX技术保证向下的兼容性。MMX技术利用SIMD（单指令多数据流）技术，开发了很多算法内部蕴藏的并行机制 ，所以它能比没有MMX技术的CPV芯片运行速度快。
MMX技术的开发者分析了大量多媒体和通信技术的应用软件，包括图形、MPEG视频压缩、音乐合成、音频压缩编码和解码、图像处理、游戏、语音识别以及视频会议，发现虽然它们是不同的应用领域，但是在数据类型和计算方法方面有共性，它们只有简单的数据类型（8位的像素RGB或YUV及2，16位的声音采样数据），定点的矩阵向量运算、局部的循环以及高度的并行性。采用SIMD结构正好能够在一条指令中并行执行多数据流相同的操作，这就是MMX技术能移加速的最根本原因。
另一个设计思想是使MMX技术与现有Intel PC机的操作系统和软件全兼容，因此对MMX的设计不得不加上许多限制，如不能引进新的状态寄存器、控制寄存器及新的条件码等，所以设计者便用浮点寄存器作为MMX的寄存器组。这样设计的原因是：同为浮点寄存器能移提供64位字长，可作定点8位、16位或32位并行运算；另一个原因是保证了与现有应用软件与操作系统的全兼容性。[4]
核心技术
通用性高
MMX技术的定义十分简单，这项技术通用性极高，可满足建立在当前及未来算法上的个人电脑应用程序的大部分需求。MMX技术使得许多条信息可由一条单一指令来处理，这种平行操作使性能得以大幅度地提高。MMX技术被集成到Intel体系结构的处理器中，同时保持了与现有操作系统（如MS DOS，Windows 3.1，Windows95，OS/2及UNIX）的充分兼容。MMX技术使个人电脑平台更上一层楼，它能运行一些新的应用程序，并增加了一些个人电脑的新用途，它帮助建立起一种把新的个人电脑用作更有效的通信和多媒体装置的范例。Intel将MMX技术集成到多代处理器中，配置了该技术的系统已经从1997年大规模生产。 除此之外，所有Intel体系结构的软件将能够在采用MMX技术的系统中运行。[1]
处理能力强　　
MMX的在计算结果超过实际处理能力的时候也能进行正常处理。若用传统的X86指令，计算结果一旦超出了CPU处理数据的限度，数据就要被截掉，而变成较小的数。MMX利用所谓的“饱和（Saturation）”功能，圆满的解决了这一问题。计算结果一旦超过了数据大小的限度，就能在可处理范围内自动变换成最大值。[1]
新特性　
MMX技术提供了面向多媒体和通信应用的新特性，同时保持了对全部现有Intel体系结构微处理器、IA应用程序和操作系统向下全部兼容，新特性如下：
1、增加了新的数据类型；把较小的数据元素的数据类型合并到一个寄存器中。
2、扩充了饱和型运算方式：定点运算时上溢下溢不中断，保持最大最小值。
3、扩充的57条新指令：扩充的MMX指令系统采用SIMD形式完成寄存器中所有数据元素的并行操作。
4、与I A结构的全兼容性：八个64位MMX寄存储组可映射到IA结构的浮点寄存器中。
（详细的特性介绍可以阅读参考资料：[4]）
优缺点
优点
MMX技术提高了很多应用程序的执行性能，例如活动图像、视频会议、二维图形和三维图形。几乎每一个具有重复性和顺序性整数计算的应用程序都可以从MMX™技术中受益。对于8位、16位和32位数据元素的处理，改善了程序的性能。一个MMX™指令可一次操作8个字节，且在一个时钟周期内完成两条指令，也就是说，可在一个时钟周期内处理16个数据元素。另外，为增强性能，MMX™技术为其它功能释放了额外的处理器周期。以前需要其它硬件支持的应用程序，现在仅需软件就能运行。更小的处理器占用率给更高程度的并发技术提供了条件，在当今众多的操作系统中这些并发技术得到了利用。在基于Intel的分析系统中，某些功能的性能提高了50%到400%。这种数量级的性能扩展可以在新一代处理器中得到体现。在软件内核中，其速度得到更大的提高，其幅度为原有速度的三至五倍。
缺点
由于MMX的运算指令必须在数据配对整齐的时候才能使用，所以使用MMX指令要比普通的汇编指令多余许多分组配对的指令，如果运算不是特别的整齐的话，就要浪费大量的时间在数据的配对上，所以说MMX指令也不是万能的，也有其很大的缺陷。同时MMX指令在处理16位数据的时候才能发挥最大的作用，处理8位数据要有一点技巧。而处理32位数据，MMX指令几乎没有什么加速能力。[5]
指令集
算术运算指令
这些指令和普通的算术指令没有什么运算规则上的区别，在一条指令里同时处理几个数据。
PADD[B、W、D] ：无符号数加[byte,word,dword]
PADDS[B , W] ：有符号数加[byte,word]
PSUB[B、W、D] ：无符号数减[byte,word,dword]
PSUBS[B,W] ：有符号数减[byte,word]
PMULHW ：有符号数乘取高位[word]
PMULLW ：有符号数乘取低位[word]。[6]　
比较运算指令
PCMPEQ[B,W,D] ：串等于比较(byte,word,dword)
PCMPGT[B,W,D] ：串大于比较(byte,word,dword)。[7]　
转换运算指令
每个指令前都有个“P”开头。这个“P”的意思就是——Packet，就是说每个寄存器里的数据都是个数据包，而不是一个数据。这些指令就是把这些数据打包或拆包用的。
PACKUSWB ：有符号数WORD带饱和压缩成无符号BYTE
PACKSS[WB,DW]：有符号数带饱和压缩成有符号数[word->byte,dword->word]
PUNPCKH[BW,WD,DQ] ：交错放置两数的高位[byte->word,word->dword,dword->qword]
PUNPCKL[BW,WD,DQ] ：交错放置两数的低位[byte->word,word->dword,dword->qword]。[8]　
逻辑运算指令
这些指令和8086汇编里的逻辑指令完全相同（除了PANDN相当于原先的两个操作与和非的结合），只是把寄存器换成64位的而已。
PAND ：按位与操作
PANDN ：按位与后再取非操作
POR ：按位或操作
PXOR ：按位或操作。[6]　
移位运算指令
为了方便的乘除法运算，但是却没有BYTE为单位的移位运算。
PSLL[W,D,Q]：逻辑左移[word,dword,qword]
PSRL[W,D,Q]：逻辑右移[word,dword,qword]
PSRA[W,D] ：算术右移[word,dword,qword]。[6]　
数据转移指
MOV[D,Q] ：数据传输(dword,qword)。[7]　
状态置空指令
状态清除。[9]
（更多详细内容可以阅读参考资料：[10]）
竞争和发展
Intel宣布MMX技术后，很快引起了积极的反响。Intel的两个主要竞争对手Cyrix和AMD分别宣布了自己的MMX策略：在各自的新一代处理器芯片M2和AMD K6中支持MMX技术。
Cyrix声称：在其M2处理器中仅用不到2万个晶体管就实现了与Intel完全兼容的MMX指令,其增加的芯片尺寸不超过1%。Cyrix同时声称，其M2处理器的L1高速缓存器的容量将增加到64K,并进一步优化其处理器内核，以加快32位指令的执行速度。M2处理器的管脚与Cyrix 6x86(M1)处理器完全相同。Cyrix 6x86用户仅需将其CPU升级到M2,即可获得MMX硬件平台。
AMD则在所兼并的NexGen公司的Nx686基础上宣布了支持MMX技术的AMD K6。
S3、Trident、CreativeLabs、ATI、Cirrus Logic、Yamaha这些大名鼎鼎的视频和多媒体卡生产厂商声称,将对MMX技术持积极态度。在国内市场上,一些著名的主板生产厂商已经在其资料和广告中标明它们的新型主板支持P55C处理器(支持在板电压调节器,可安装下一代2.x V CPU)。 与硬件厂商相比,那些能从MMX技术受益的软件厂商的反应更为强烈。MMX技术不仅将带动又一轮软件升级浪潮,而且为软件公司推出新产品奠定了坚实的硬件基础。其中，Microsoft和Powersoft/Watcom公司分别宣布,将在其Visual C/C++ 4.1和Watcom C/C++ 11.0中支持MMX技术。[11-13]