MMX,SSE,SSE2扫盲

MMX 指令集
    MMX(Multi Media eXtension,多媒体扩展指令集)指令集是Intel公司于1996年推出的一项多媒体指令增强技术。MMX指令集中包括有57条多媒体指令,
通过这些指令可以一次处理多个数据,在处理结果超过实际处理能力的时候也能进行正常处理,这样在软件的配合下,就可以得到更高的性能。MMX的益处在于,
当时存在的操作系统不必为此而做出任何修改便可以轻松地执行MMX程序。但是,问题也比较明显,那就是MMX指令集与x87浮点运算指令不能够同时执行,
必须做密集式的交错切换才可以正常执行,这种情况就势必造成整个系统运行质量的下降。

SSE指令集
    SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,
Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,
并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,
而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。

  而最终推出的SSE指令集也就是所谓胜出的"互联网SSE"指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)
浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、
音频处理等诸多多媒体应用起到全面强化的作用。S SE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。
SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。

SSE2指令集
    SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)
指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,
这些指令提高了广大应用程序的运行性能。随MMX技术引进的SIMD整数指令从64位扩展到了128 位,使SIMD整数类型操作的有效执行率成倍提高。
双倍精度浮点SIMD指令允许以 SIMD格式同时执行两个浮点操作,提供双倍精度操作支持有助于加速内容创建、财务、工程和科学应用。
除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如,双字和四字)的算术运算,支持灵活并且动态范围更广的计算功能。
SSE2指令可让软件开发员极其灵活的实施算法,并在运行诸如MPEG-2、MP3、3D图形等之类的软件时增强性能。
Intel是从Willamette核心的Pentium 4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始才支持SSE2指令集的。


首先普及一下基础,指令分整点和浮点两类,处理不同类型的数据,两类之间基本上没有关联,用在不同的场合。多媒体只用整点,比如高清编解码。3d游戏基本上只要用浮点就可以了。

多媒体指令加速的原理就是SIMD(单条指令处理多个数据)。比如要处理8-bit像素组成的图像,我用64位加速指令,一条指令同时可以处理8个像素,不就加速了8倍吗!确实是这样的,但是实际也加速不了八倍。SIMD指令比普通指令运行周期要长。一般运气好一点综合性能加速3倍,就很不错了。

mmx/sse是一对兄弟,他们都是64位加速。intel最早在奔腾166mmx上加入mmx指令集,他们是单纯的整点加速,专用于多媒体加速。后来的sse出来,又加入了浮点指令,同时也新增了几条整点,作为旧的mmx的补充。从此SIMD的架构就基本定型了。

sse2是128位加速。后来intel看到mmx/sse组合很强悍,就琢磨着,既然64位能加速很快,我干嘛不把位宽再增加1倍呢?于是就把所有的mmx/sse指令名字前面加个x,表示扩展了,这样就推出了sse2。几乎每一条sse2指令都有相应mmx/sse指令与之对应。所以对于程序员来说,会用mmx/sse了,sse2就不用学了,无非是同时处理个数翻倍而已,原来写好的程序照葫芦画瓢就行了。

下面举个例子:
psubb mm0,mm1     --> 这是一条64-bit mmx指令,mm0,mm1里面是8个8位整数,同时做减法
psubb xmm0,xmm1    --> 这是一条128位sse2指令,xmm0,xmm1里面是16个8位整数,同时做减法

上面一条指令,就分别做了8次、16次减法,是不是加速了很多?

不过实际应用中sse2却并不比sse加速很多,一般也就5%~10%,几乎可以忽略不计。这是为什么呢?原因一方面就是sse2位数太宽了!你必须找到总共128bit的几个连续的数据并排傻站着等你做完全相同的处理,一般这个条件并不容易满足。另外一个就是sse2本身的处理效率比sse低,别看嘴巴张开大了1倍,吞咽速度却没跟上,最后吃进肚里的速度还是差不多。

你可能感兴趣的:(算法,互联网,扩展,图形,extension,图像处理)