《电脑报》:流指令扩展指令集SSE解析:CPU的兴奋剂

2008年01月25日 20:31 次阅读 稿源: 条评论
随着45nm制造工艺的Intel Penryn处理器的发布(包括双核心桌面处理器Wolfdale、四核心桌面处理器Yorkfield、双核移动处理器Penryn等家族成员),一个新的名词又频繁地出现在我们眼前,这就是SSE4(Streaming SIMD Extensions,流指令扩展指令集),或者更准确的说法SSE4.1.我们已经习惯,每一代CPU的升级,Intel都要拿SSE说事,宣传得让局外人以为有了SSE,CPU就像吃了兴奋剂,没准还能跑过刘翔.下面我们就对SSE来一个大清算,让你有一个正确的了解.
 SSE:为多媒体而发明的那剂“药”

  任何一个计算机程序,最终要变成一系列指令才能在处理器上运行,这些指令的合集就是我们常说的指令集。从上世纪70年代末的16位 8086 处理器开始发家,经过上世纪90年代历时十几年的鏖战,利用SUN、SGI、IBM、DEC、HP 和摩托罗拉这6家精简指令集处理器厂商群龙无首的矛盾,Intel终于获得了x86处理器在个人电脑市场上的胜利。x86处理器,包括AMD的处理器,所 支持的指令集就是x86指令集。如果是计算机科班出身,应当不会对ADD、DAA、MOV这些接头暗语式的x86指令感到陌生。

  那为什么Intel还要在x86指令集中再增加一组SSE指令呢?抱歉,这还得从SSE指令集的前身——MMX(Multi Media eXtension,多媒体扩展指令集)说起。正是从MMX开始,多媒体指令集才开始大红大紫。

  流指令扩展指令集SSE解析:CPU的兴奋剂

  MMX当年让不少人心甘情愿地掏银子

  比如我们要计算从1到100这些数字它们的平方是多少。CPU会先把1从内存读入到寄存器,然后算出它的平方,再把计算结果从寄存器中取出放入 内存中,然后不断重复这个过程直到把100个数字算完。但是问题是不管CPU的运算速度有多快,它一次也只能处理一个数据,在现实生活中,有很多数据特别 是多媒体数据总是成组出现,比如图像,每一点的色彩就由红蓝绿三原色三个数据组成,声音也有左右声道之分。当CPU遇到这样数据,还需要拆开来挨个处理, 效率无疑非常之低。

  因此,最早的“兴奋剂”——MMX,在1997年出现也就不奇怪了。当时正是个人电脑从奇客、科研机关迈向个人用户的转折时期,CPU所处理的数据也从整数、浮点数变成了JPEG、MP3或者MPEG。

  如果说Intel的技术水平一流,那么Intel的市场眼光和营销手法就是超一流。Intel敏锐地看到了这一趋势,给Pentium处理器配 上了新捣鼓出的MMX指令集,不但让Pentium大卖,也开创了Intel CPU引入SIMD(Single Instruction Multiple Data,单指令多数据流)指令集之先河。

  工作:多拉才能快跑

  说穿了,MMX和后来的SSE都是SIMD指令的一种,即在一个CPU指令周期内用一个指令完成处理多个数据的操作。也许这样你会觉得抽象,SSE具体如何工作,我们举一个实例说明。

  下面我们有一个五行四列的浮点数数组,要计算其中每一个元素的平方根。如果CPU不支持SSE指令,实现这个任务的代码只能这样写:

  for each f in array

  {

  把f从内存加载到寄存器

  计算平方根

  再把计算结果从寄存器中取出放入内存

  }

  如果CPU支持SSE指令,一次就可以读取数组中每一行的4个元素加以处理。采用SSE技术后,算法可以写成下面的样子:

  for each members in array //对数组中的每个元素

  {

  把数组中的5行数字加载到SSE寄存器中

  在一个CPU指令执行周期中完成计算其中每行的4个数的平方根的操作

  把所得的结果取出写入内存

  }

  前一种算法,CPU需要计算20次才能得出结果,而采用SSE指令后,只要计算5次就可得出全部结果,不难看出SSE指令可以节省大量计算时间。

 流指令扩展指令集SSE解析:CPU的兴奋剂(2)

  SIMD的精髓是从一次处理一个变成一次处理一组

  演进:逐步扩充的帝国

  MMX发布于1997年,一共57条指令,除了emms、movd和movq这3个指令,其他所有的MMX指令都以字母p开头。MMX指令与 FPU(浮点运算器)使用同样的8个通用寄存器,准确说是借用了FPU每个寄存器的前64位,这样MMX指令一次最多可以处理8个字节或者4个字节或者2 个双字节或者1个4字节的数据,理论上可以将运算速度最高提高8倍。

  MMX与FPU共用寄存器证明了Intel的短视,因为如果FPU要使用寄存器,MMX这时必须暂时退出,等FPU用完之后才能恢复原状。加上 早期Intel处理器具有很强的浮点运算能力,游戏开发者都喜欢采用浮点运算,冲突的结果就是MMX的作用大打折扣,甚至有时还会造成性能的瞬间剧降。

  Intel没有沿用MMX的称呼,1999年的Pentium Ⅲ处理器上指令集改称SSE。SSE采用了单独的寄存器,解决了与FPU冲突的问题。8个128位单独的SSE寄存器,支持同时处理 4 个单精度浮点数,能够同时处理的数据比64位的MMX翻了一番。SSE一共有70条指令,进一步提升了CPU多媒体处理能力。也从这时开始,SSE的名称 固定了下来。

  流指令扩展指令集SSE解析:CPU的兴奋剂(3)

  SSE指令集在不断地扩充

  伴随Pentium 4而来的SSE2(2000年),从144个指令数目来看,简直就是一场大跃进。SSE2主要加入 64 位双精度浮点数及整型运算指令,以及加入处理器对 Cache 的控制指令以减低延迟。另外也可以简单地理解,就像可调用的函数,增加的新指令数目越多,SSE2能发挥作用的场合也越多。架构上SSE2相比SSE并无 大的进步,仍然是8个128位寄存器,主要的增强的方面在于SSE2可以处理双精度浮点数。

  Pentium 4是Intel的黄金时期,也是生命周期最长的CPU产品。因此直到2004年发布Prescott核心的Pentium 4处理器,SSE家族才又添新丁SSE3,而这时SSE指令集已经是名满天下。这一次SSE3只有13个指令,主要特点是加入了水平式寄存器整数运算,可 对多个数值同时进行加法或减法运算,令处理器能大量执行 DSP 及 3D 一类的运算。浮点数转换成整数而不须要进行运算模式切换,避免模式切换时导致其他执行线程被延误,降低系统运算效能。其中为了利用HT超线程技术,特别增 加了monitor 和mwait这两个指令。

  2006年Intel酷睿处理器上的SSSE3(Supplemental Streaming SIMD Extension 3)指令集,命名让很多人都感到奇怪,甚至觉得应该叫SSE4才对。后来发现这种说法还是有依据的,SSSE3新增的16 条指令,原本计划收录在 SSE4 指令集中,后来Intel才决定提前发布。这16条指令进一步增强 CPU了在多媒体、图形图像和 Internet 等方面的处理能力。

  随着Penryn处理器到来的SSE4,被视为继 2001 年以来最重要的多媒体指令集架构的改进,除扩展 Intel 64 指令集架构外,还加入有关图形、视频编码及处理、三维成像及游戏应用等指令,指令涉及音频、图像和数据压缩算法的应用程序大幅受益。不过,SSE4 将分为 4.1 版本及 4.2 版本,4.1 版本共新增 47 条指令,主要针对向量绘图运算、3D游戏加速、视频编码加速及协同处理加速动作。下一代 45 nm的Nelahem处理器将会追加 SSE 4.2 版本,合共 54 条指令。

  生效前提:优化的程序

  从前面讲到的SSE指令集工作过程,细心的读者不难悟出,要想SSE发挥作用,除了CPU的支持,程序针对SSE指令的优化也是必不可少的一 环。就是说,SSE的应用,与程序开发者息息相关。这帮人得把Intel的SSE指令集手册背得滚瓜烂熟,然后在自己的程序中用起来,终端用户才能感受到 SSE指令的奥妙。

  在这方面做得比较好的是TMPGEnc这个软件,是一个日本人开发的专业视频转码软件。最新的TMPGEnc 4.0 Xpress已经可以支持SSE4.1指令集。并且在它的选项设置中,可以开关相应指令集的启用,有兴趣的读者可以实际试一试,看一看哪种指令集对视频转 换的影响最大。另外DivX Converter 6.5也支持SSE4.1指令集。而据Intel透露,2008 年第一季就将有 21 款软件支持 SSE4 指令集。相信还有很多软件,虽然针对SSE进行了优化,却没有大事宣扬。

  流指令扩展指令集SSE解析:CPU的兴奋剂(4)

  TMPGEnc支持完整的SSE指令

  需要特别注意的是,每一代的指令集并不是互相替代的关系,而是互为补充的关系。并不是说这款软件支持SSE4.1,相比另一款采用MMX的软 件,前者的效能就一定要高,或者前者作者的水平一定要高。连Intel也提醒开发者,请不要忽视 MMX,因为它的速度在某些情况下比SSE更快。

  分分合合的AMD

  一个指令,同时处理多个数据的好创意,其他CPU当然也不会放过。AMD看到Intel MMX,眼红之下在K6 CPU里搞出了一个类似的3DNow!来,因为MMX与浮点数混用时性能会有下降的情况,支持浮点数并行处理的3DNow!找着了机会。其实是AMD占了 Intel的便宜,因为很多程序员把3DNow!作为MMX的一个补充,处理整数的时候用MMX,处理浮点数的时候用3DNow!。

  流指令扩展指令集SSE解析:CPU的兴奋剂(5)

  从SSE4开始,AMD与Intel分道扬镳

  1999年的时候,AMD在Athlon处理器上又添加了几个指令,这就是3DNow!+,又被称为3DNow!2。不过看到大势已去,AMD 终于放弃了在多媒体指令集上的抵抗,转而支持Intel SSE,这样双方一直到SSE3都相安无事。统一的标准其实是一件好事,要是一个软件分别有SSE版本和3DNow!+版本,开发者和用户很快都会不堪其 扰。

  但是最近AMD和Intel在多媒体指令集上又开始大打出手,大有分道扬镳的势头。与Intel SSE4.1针锋相对,AMD Phenom只支持SSE4A指令集,并且AMD在去年8月抢先放出了SSE5的风声,而Intel则断然拒绝支持AMD的SSE5,直到现在双方还相持 不下。

  结语

  经过多年的发展,多媒体指令集已经成为CPU密不可分的一部分。每次有新的CPU出来,我们也习惯了用CPU-Z检测一下它有没有添加什么新的 指令集。从我们的应用环境来看,3D影像越来越复杂,视频编码的压缩率越来越高,都对CPU提出了更高的要求,可以想象,SSE这剂“兴奋剂”,CPU只 有一直服用下去了。

对文章打分

《电脑报》:流指令扩展指令集SSE解析:CPU的兴奋剂

1 (4%)
已有 条意见

    最新资讯

    加载中...

    编辑精选

    加载中...

    热门评论

      Top 10

      招聘

      created by ceallan