分享

主流处理器中的数据并行支持(SIMD)

 Foxmouse 2012-10-09

前瞻-主流处理器中的数据并行支持(SIMD)

引言部分:

多媒体处理算法应用在很多媒体处理环境中,如对文本,手写数据,2D/3D图形和音频对象的捕捉、制造、存储和传输等。过去 都是使用昂贵的多媒体处理硬件协同工作来加速。现在,通用处理器通过在体系结构上增加媒体处理支持来减少使用协同处理器分配和返回带来的开销。在通用处理 器上一个基本的操作能同时作用多个元素的支持成为SIMD并行处理。通过SIMD扩展,通用护理器通过捕捉多媒体算法中潜在的并行特性来加速应用。

自 Intel在Pentium II和Pentium 处理器引入了MMX技术以来,IA-32架构已经引入了许多SIMD扩展,分别是:MMX,流SIMD扩展(SSE), 流SIMD扩展(SSE2)和流SIMD扩展(SSE3),SSSE3,SSE4和高级向量扩展(AVX).这些扩展都提供了一组指令,能够为封装好的整 点或浮点数据提供SIMD类型的操作。其他结构也 有自己的SIMD扩展。如AMD的3DNow!,Cell和PowerPC的AltiVec等等。
可惜的是,和CPU提供的其他技术一样,多媒体 指令系统扩展的潜能并没有完全的发挥出来。目前,已经有一些论文在倡导科学家,软件开发人员使用这些指令加速程序。
这篇评论试图更深入的介绍 Intel的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!加速,OpenGL也可以使用3DNow!加速.
3DNow!为高分辨率的显示提高了帧频率,更接近 现场的高保真音频等等。

小小结:

操作系统对某个体系结构的支持,已经远远不是单纯的某个指令集能解决的问题。为了用户体验和应用性能提升,需要更多的软/硬件协同的设计。软件设计 中需要哪条指令更高效的运行,哪些指令用不到,都可以给硬件设计作参考。这也是Wintel联盟如此紧密的原因。与CPU架构密切相关的SIMD指令,作 为改进普通中端用户多媒体体验的关键,更是在Windows系统中占据不可替代的作用。

在Gentoo portage中做了个简单的调研,发现现在使用SIMD加速的包很少,如mplayer,ffmpeg,gimp,大多数都为多媒体应用程序,支持最多 的也只有sse,sse2,3DNow和mmx,再新的根本没有。而且Intel等芯片设计厂商也有一些未公开的特殊指令,只提供给某些合作伙伴使用,再 加上开源爱好者们没有那么多的时间和精力去根据已有的程序和算法,按照某个芯片独特的SIMD支持,设计并验证针对它的软件修改。那很多开源软都难用到这 些特性。性能也就没办法和Windows下的相比。

这小小结,只是愤青的一点感慨而已。既得利益集团是不会在乎这些的。

敬请期待SIMD系列下文《前瞻-拿起SIMD的武器!》

PS:原文根据ayaya的评论做了很多更正,谢谢ayaya:)

参考:
A Review of SIMD Multimedia Extensions and their Usage in Scientific and Engineering Applications.

http://en./wiki/Streaming_SIMD_Extensions

http://en./wiki/SSSE3

http://en./wiki/SSE4

http://en./wiki/SSE5

http://en./wiki/Advanced_Vector_Extensions

http://en./wiki/CVT16_instruction_set

0

相关文章:

6 thoughts on “前瞻-主流处理器中的数据并行支持(SIMD)

  1. 这篇很多疑问啊。

    >自 Intel在Pentium II引入了MMX技术以来

    MMX 是从 Pentium 开始引进的,我亲身用过 Pentium MMX 166MHz。

    >IA-32架构已经引入了4类SIMD扩展,分别是:MMX,流SIMD扩展(SSE), 流SIMD扩展(SSE2)和流SIMD扩展(SSE3)

    你下面写有 Intel 的 SSE4 / AVX,AMD 的 SSE5 啊。个人认为即使 SSE4/SSE5 不够资格单独成一类,但 AVX 绝对是要独立的。

    >补集

    感觉补集在集合论里有专门的意思,是如果 Extension 一般译成扩展。

    >目前微软的Windows 9X,NT和所有最新系统,DirectX 6.x都支持3DNow!
    Win 9X / WinNT 这些系统能够跑在 Pentium 上,它们本身应该是没有用到 3DNow! 指令的。由于操作系统要照顾到非常低端的 CPU,一般会大大限制允许使用的指令集,比如把 Pentium 4 当成一个很快的 Pentium 用。Intel 的 CPU 从来没有实现过 3DNow!,相信操作系统是不会去用 AMD 的这套东西,否则不能运行在 Intel 平台上会被骂死。

    不知这里“支持”是什么意思。运行在系统上的应用程序可以利用较新的指令,但只能说应用程序支持,不能说系统支持吧。

    >OpenGL也支持.
    非 x86 平台不讲,OpenGL 本身是个标准,无所谓支不支持 3DNow! (或者 SSE/2/3) 等指令集。我记得很早以前 SGI 有一个超古老的 OpenGL 低版本实现使用了 3DNow!,但很多实现是没有用到 3DNow! 的,Win98 自带的就没有。

    事实上由于 AMD 太弱势,据我所知,这公司的标准基本没人理,除了 AMD64 这个大杀器。

    >在Gentoo portage中做了个简单的调研,发现使用到SIMD加速的包很少,几乎都是多媒体引用的
    >因为SIMD扩 展对于特定的应用仍然很有意义,这些应用的特点是本身有并行的任务,需要大量的独立数据运算

    这两句有点矛盾吧。

    目前想要有效地使用 SIMD 加速,还是需要手工写汇编,这本身就大大限制了它的普及。而且 SIMD 这个操作模式多媒体比较适合。比如颜色的 RGB 三个分量正好放到 X0,X1,X2 寄存器,两个颜色混合就 XMM0 + XMM1 一次搞定,等等。

    >如果Intel等芯片设计厂商不公布一些用于加速的性能细节

    我觉得 Intel 的芯片手册已经挺详细了,规范和范例都很好啊,推广 SSE2 很用功的。CPU 的开放程度比 GPU 强太多了。

    Windows 平台使用 SIMD 的程序也很少啊。而且既然用 Gentoo,可以 /etc/make.conf 里设置让编译器自动使用 CPU 支持的全部可用指令集,只要 gcc 争气,比 Windows 还强呢。

    >如果开源爱好者们没有那么多的时间和精力去根据已有的程序和算法,按照某个芯片独特的 SIMD支持,设计并验证针对它的软件修改

    开源社区缺乏足够的资源,这个不能怪 Intel/AMD 吧 :)

    >这小小结,只是愤青的一点感慨而已。既得利益集团是不会在乎这些的。

    我也用 Gentoo,但出于以上理由,觉得这个结论是想当然的,有偏见的。

    • 1,抱歉,是我的翻译疏忽。原文是”Beginning with the Pentium II and Pentium with Intel MMX technology processor families, four extension…”,这段刚开始翻译时,没怎么读懂,就直接取了最晚发布的Pentium II,没有提Pentium,已更正。
      2,SSE3之后的SIMD扩展是我根据维基百科的内容,添加上去的,这篇论文因为发布的较早,所以没有提到这些。所以某些地方没有改过来, 已更正:)
      3,这个是翻译的错误,SSE5的介绍来自维基百科,原词为”supplement”,已更正。
      4,表达的不准确,原意是想说 Direct 6.X也可以使用3DNow!做加速,这样在AMD的CPU上有性能提升。至于不支持3DNow!的CPU,也可以使用通用的方式运行,已修改。
      5,这个也是我表达不准确,应该是OpenGL也可以使用3DNow!加速(http://www./us-en/Corporate/VirtualPressRoom/0,,51_104_557_560,00.html),已修改。AMD的很多技术确实比不上财大气粗的Intel。
      6.这两句是不矛盾的,一个说现实中已经使用SIMD扩展加速的程序,一个说理论上哪些程序可以使用SIMD加速,修改了一下原文,表述更精确些。SIMD加速确实很不容易做。手写汇编很头疼,不过编译器还提供了一些SIMD 函数调用及向量数据类型支持(http:///gcc-simd/),用起来方便很多,不过怎么初始化向量数据还是很头疼,还有数据对齐之类的问题要考虑:).
      7,很多CPU确实有某些未完全公开的指令(http://rram.spaces.eepw.com.cn/articles/article/item/77220).Windows 平台因为不用提供源码,所以用户没办法知道有没有用SIMD,但我觉得至少很多显卡声卡驱动,还有文中提到的Photoshop肯定会有的。/etc /make.conf里设置use也得源码包支持这些use才行。Gcc都基本是一些商业公司在支持了,GCC AVX的patch都是intel的人做的(http://gcc./ml/gcc-patches
      /2009-01/msg00226.html),所以Intel不给这些人发钱,这些人也没有时间和精力提交这种patch。大家都想周六周日陪陪老婆孩子,出去野餐度假什么的:)

      最后,非常感谢你提出的修改意见:)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多