引言部分:
多媒体处理算法应用在很多媒体处理环境中,如对文本,手写数据,2D/3D图形和音频对象的捕捉、制造、存储和传输等。过去 都是使用昂贵的多媒体处理硬件协同工作来加速。现在,通用处理器通过在体系结构上增加媒体处理支持来减少使用协同处理器分配和返回带来的开销。在通用处理 器上一个基本的操作能同时作用多个元素的支持成为SIMD并行处理。通过SIMD扩展,通用护理器通过捕捉多媒体算法中潜在的并行特性来加速应用。
SIMD 技术:
SIMD是最早提出的并行处理模式之一,也是最简单最普遍的并行方法,试图用一个指令对数据集合中的每个数据作相同的操作。如下 图所示:
虽然SIMD技术还没有广泛应用,但也没有完全小时。因为SIMD扩 展对于特定的应用仍然很有意义,这些应用的特点是本身有并行的任务,需要大量的独立数据运算,包括3D图形运算,图像处理,语音识别,科学计算,数据库查 询等。
MMX技术:
MMX是在第五代奔腾处理器中作为附加扩展引入的,最早用在提升图像生成,加密,视频编解码和I/O处理 上,相对于无MMX技术的处理器,通常能带来1.5到2倍的加速.MMX能处理64位封装的整型,引入了8个64位寄存器来实现、四种MMX数据类型(封 装的字节,半字,字,双字)和57条MMX指令.
8个MMX寄存器是通用寄存器,是浮点寄存器(ST0-ST7)的低64位的重用.MMX的数据 类型可以是8个字节整型元素的数组,4个半字整型元素的数组,2个字整型元素的数组或者1个双字整数.做SIMD运算时,SIMD指令取两个MMX寄存器 中的操作数,作相应的SIMD运算,并将结果存入结果寄存器中。MMX的指令系统由57条指令构成.包括基本算术操作、比较操作、转换操作、逻辑操作、移 位操作、访存及寄存器间移动操作和状态指令。因为MMX寄存器复用浮点寄存器,必要时,需要对MMX寄存器清空以便正常的浮点运算可以进行。 MMX 引入了一种新的溢出方式:饱和溢出(Saturation overflow).传统的溢出很多都是反转溢出(wraparound overflow).对于反转溢出,即溢出高位。但对于图像处理,这样做就不合适,比如两个白色的像素点相加,因为溢出,取低位,可能会是一个黑色的点, 显然和实际不符。饱和移除就是为解决这个问题,即若溢出则保留最值,而不是简单的取最低的几位。MMX提供有符号和无符号两种饱和溢出。流 SIMD扩展技术(SSE)
SSE在Intel 奔腾III中引入,作MMX技术的升级,并保持向后兼容。SSE扩展包括增加对128位寄存器內封装的或者普通的单精度浮点值的操作。SSE扩展引入了一 个新数据类型:128位封装单精度浮点类型,有4个IEEE标准的32位单精度浮点类型组成.该单精度数可以在XMM寄存器內或者主存中。SSE引入5类 新寄存器:XMM寄存器:8个128位寄存器支持单精度运算(XMM0-XMM7),能被x87 FPU,MMX寄存器或通用寄存器访问;MXCSR寄存器:32位寄存器包含SIMD浮点操作的控制和状态信息;MMX寄存器:用于64位封装整型,或者 为某些在MMX和XMM寄存器之间运算的操作提供操作数;通用寄存器:因为MMX和XMM寄存器不能用于存地址,8个32位的通用寄存器就被引入用于保存 SSE模式下的操作数的存储地址;EFLAGS寄存器:用于记录某些比较结果的32位寄存器.
SSE也引入了70条新指令,可以分为4 类:SIMD单精度浮点运算;MXCSR状态管理指令;64位SIMD整点指令(扩展原MMX指令集);cache控制,预取和取值指令。 目前很 多的图形软件采用了这项技术,如Adobe Photoshop会在有SSE扩展的机器上用SSE加速,微软也在DirectX 6.1和之后的音/视频驱动中加入了SSE,这些都已经包含在Windows 98,Me,2000,NT和XP。流SIMD扩展技术 2(SSE2)
SSE2在奔四和Xeon处理器中引入,SSE2允许更多的计算并行,并扩展了MMX和SSE中的指令,而且引入了两个双精度浮 点数据类型。具体引入特性如下:六中数据类型、支持新数据类型的指令和对已有SIMD整型操作的扩展、修改已有指令以便支持SSE2.
双精度 SIMD运算的支持增强了在XMM寄存器上作高精度计算的能力。SSE2也让XMM寄存器可以作128封装整型的运算。现在程序员可以使用完备的SIMD 寄存器、数据类型和指令来开发混合单/双精度浮点,64位/128位整点的数据.SSE2并没有引入新的寄存器,只是做了功能扩展。流 SIMD扩展技术3(SSE3,SSSE3)
SSE3在奔腾四为了支持超线程而引入。SSE3扩展包括13条新指令.SSE3并没有引入新的数据类型和寄存 器.
SSSE3在Intel Core架构中引入,增加了16条指令,每条指令都能在64位的MMX寄存器或128位的XMMS寄存器上运算
流 SIMD扩展技术4(SSE4)
SSE4 2006年9月发布,AMD k10和Intel Core中有使用,包括54条新指令。SSE4中增加了并非特定于多媒体应用的指令,如STTNI指令可以加速文本和字 符串处理;ATA能加速冗余校验。
流 SIMD扩展技5(SSE5)
SSE5是AMD 2007年8月发布的,作为AMD64结构在128 SSE基础上的补充。
高级向量扩展 (AVX)
Intel 2008年3月发布的SIMD扩展.寄存器从128位扩展为256位,并使用新的寄存器名YMM0-YMM15,已有的128位指令使用256位寄存器的 低128位.使用无副作用指令格式,即所有形如a=a+b的操作都会会被替换为c=a+b,这样操作数计算的结构不会污染原操作数,所有的有两个操作数的 XMM指令都会用这种方式扩展为3个操作数的形式.访存中对SIMD数据对齐的要求放宽。
AVX中指令的编码方式也有改变,通过 修改前缀使得无副作用指令格式得意实现。AVX扩展适用于多媒体、科学计算和经济方面的应用,能有效增加并行性和浮点SIMD运算的吞吐率,降低寄存器载 入开销。目前Linux 2.6.30、Windows 7 SP1和Windows Server 2008 R2 SP1都有AVX增强.3DNow!技术
3DNow!是AMD在MMX的基础上作的扩展,和SSE对MMX的扩展相似。最早用在 AMD-K6-2处理器上,之后在AMD-K6-III和AMD Athlon处理器上实现。3DNow!是一组指令,有效缓解了传统多浮点运算和多媒体应用的瓶颈。3DNow!使用MMX寄存器但增加了45条浮点指 令,能同时对1个或2个单精度浮点值作运算.3DNow!支持加、减、乘、除、和整点之间的转换、比较、绝对值、数据预取等操作。根据AMD提供的资 料,3DNow!的带来,如同SSE为MMX带来的同等提升,但指令和复杂度降低。但SSE和3DNow!不兼容。目前微软的Windows 9X,NT和所有最新系统,DirectX 6.x可以使用3DNow!加速,
3DNow!为高分辨率的显示提高了帧频率,更接近 现场的高保真音频等等。小小结:
操作系统对某个体系结构的支持,已经远远不是单纯的某个指令集能解决的问题。为了用户体验和应用性能提升,需要更多的软/硬件协同的设计。软件设计中需要哪条指令更高效的运行,哪些指令用不到,都可以给硬件设计作参考。这也是Wintel联盟如此紧密的原因。与CPU架构密切相关的SIMD指令,作为改进普通中端用户多媒体体验的关键,更是在Windows系统中占据不可替代的作用。
在Gentoo portage中做了个简单的调研,发现现在使用SIMD加速的包很少,如mplayer,ffmpeg,gimp,大多数都为多媒体应用程序,支持最多的也只有sse,sse2,3DNow和mmx,再新的根本没有。而且Intel等芯片设计厂商也有一些未公开的特殊指令,只提供给某些合作伙伴使用,再加上开源爱好者们没有那么多的时间和精力去根据已有的程序和算法,按照某个芯片独特的SIMD支持,设计并验证针对它的软件修改。那很多开源软都难用到这些特性。性能也就没办法和Windows下的相比。
这小小结,只是愤青的一点感慨而已。既得利益集团是不会在乎这些的。
敬请期待SIMD系列下文《前瞻-拿起SIMD的武器!》
PS:原文根据ayaya的评论做了很多更正,谢谢ayaya:)
参考:
http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions
http://en.wikipedia.org/wiki/SSSE3
http://en.wikipedia.org/wiki/SSE4
http://en.wikipedia.org/wiki/SSE5
http://en.wikipedia.org/wiki/Advanced_Vector_Extensions
http://en.wikipedia.org/wiki/CVT16_instruction_set