荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: trunks (深蓝的海), 信区: Hardware
标  题: CPU软加速--全面剖析Intel下一代SSE技术(二)
发信站: 荔园晨风BBS站 (Tue Apr  1 20:37:32 2003), 站内信件

MMX, 3DNow!, SSE, SSE2: 优化原则

  在讨论新的指令集之前,先让我们回顾一下以前的SIMD扩展
指令集。首先我们要认识一下这些指令集带来的性能提升。

  所谓SSE是指数据流单指令多数据扩展(Streaming SIMD
Extensions),在一些硬件评测中,你可能经常会看到由于一些
程序为SSE指令集做了专门的优化,相应CPU的表现相当的突出。
我们不禁要探究最早的X86处理器,例如486,Pentium,是怎样
工作的。实际上,它们用一些寄存器存储二进制数据,将其中
两个寄存器中的数据相加后,和第三个中的进行比较,如果所
得的结果大,则和指令集中的指令相符,随即进行下一步的操作。
但随着CPU性能提升,问题也开始暴露:由于这些指令同时只能
执行一次计算,CPU在执行完前一个指令以前,不能执行下一个
指令。虽然CPU由上百个ALU构成,但这并不能加快它的计算速度,
因为只有一个ALU处于工作状态,而其他都在等待它的计算结果。
为了改进这种情况,Intel推出了单指令多数据扩展架构的CPU,
引入了我们大家非常熟悉的第一代SIMD扩展指令集:MMX。

  通过MMX,一条指令可对2个以上的数据流执行计算,由于每
对数据都处于各自独立的寄存器中,CPU在频率不变的情况下,
运算单元被大大增加了。这也意味着,在同一时刻,CPU能进行
能多的数据流计算。

  为了实现性能的提升,软件必须采用SIMD扩展指令集。由于
CPU不能在一个寄存器里面放置不同的数据,这就要软件命令CPU
将需要的多个数据放入MMX寄存器中,利用SIMD指令进行多数据
的计算。为此,相应的数据必须在内存中待命。在通常情况下,
为SIMD优化的编译器会有很大作用,它能尽可能避免使用原始的
指令,而采用高效的SIMD指令,但是前提是程序代码必须遵循高
效编译的原则。

操作  部分3  部分2  部分1  部分0  寄存器
      70     50     30     10     1
 +
      80     60     40     20     2
 =
      150    110    70     30     结果

  并不是每一种运算都可以用SIMD优化,例如下面的表达:
(a + b * c) * d,计算它至少需要三个命令,相反,对于四维坐
标中(x, y, z, w) 的运算就可以缩减到三个SIMD指令来完成。CPU
执行SIMD指令的速度和原始指令的速度是一致的,这使得为SIMD
优化的程序在运行时会有成倍的提升。

  从开发者的角度出发,有多种SIMD优化的方法,例如直接手工
代码优化,虽然效果很好,但费时费力。也可以采用SIMD编译器,
但会带来许多难以预料的后果。最后还可以采用CPU厂商提供的标
准程序库,里面提供了很多常规应用的优化方案。看起来,第三种
方法最为可行。

    那么,不同SIMD扩展指令集之间有什么差别呢?它们支持的数
据类型不一样,采用的寄存器大小和数量以及包括的指令集合也各
有千秋。但是数据类型不同是最为直接的区别。 CPU中的数据有很
多种,其中最重要的是整数和浮点数。不同的应用程序需要用到不
同格式的数据种类。

MMX

  MMX指令集早就为大家熟悉,现在更是成为了pc的一项标准。
MMX是multi media extension的简写,扩展指令集主要用于处理多
媒体数据、图象、和声音。

支持MMX的处理器共有8个MMX寄存器,每个64bit (8个字节)大小。
MMX只能对整数进行操作,分别支持1,2,4,8字节的数据。也就
是说,一个MMX寄存器能储存8,4,2,1几种操作数。

字节7 字节6 字节5 字节4 字节3 字节2 字节1 字节0
-128 127   100   70    60    -50  20    10

Word 3   Word 2    Word 1   Word 0
15000    -30000   20000    10000

  MMX寄存器能对储存的数据进行加、减、乘等操作。同时在多
媒体应用中,除了无法进行除法运算,还经常要用到其他指令操作,
例如非溢出加法运算、算术平均值运算、逻辑运算等。应用了MMX以
后,许多操作的运算速度大大加快了。此外,MMX需要进行手工优化;
编译器的作用微乎其微。例如,不同的音频解码器一般都要对MMX进
行优化,从而使它们的运算能很好的发挥MMX的性能。通常,只有一
小部分程序起到关键的作用,而对症下药往往能降低优化编码的工作量。

SSE2 整数指令集

  让我们告别以近已经垂暮的MMX,看看Intel的新科状元:SSE2。
很显然,SSE2由两个不同的部分组成:SSE和MMX。前者处理实数,后
者则负责整数。同MMX相比,SSE2寄存器要大一倍,例如SSE2可以储
存16个数而不是8个。由于指令的运算速度仍然保持不变,经SSE2优
化处理后的编码性能表现翻倍。值得一提的是,经MMX优化后的程序
能轻松的应用于SSE2,因为它们指令集系统是相似的。

  虽然Athlon XP处理器并不支持SSE2。但令人吃惊的是,Pentium
4和Athlon XP的首轮较量竟全面告负。但在应用程序在对SSE2进行了
消化之后,Pentium 4终于挽回了一些颜面。

  我们应该看到,从MMX到SSE2,CPU获得了喜人的性能提升。虽然
为MMX进行优化的程序并不多见,但是这些程序都优化的相当彻底。我
们还应该注意到,Intel 为软件开发商提供了丰富的SSE2优化编码库,
它们包括实现基本功能的大量编码,这为Pentium 4摆脱困境起到了举
足轻重的作用。

SSE

  下面我们来讨论一下SSE指令集。它最早应用于Pentium III处理
器,随着Pentium 4的出现,SSE因大幅提升了处理器性能从而声名大噪。

  SSE的作用是加快实数运算。这些数据通常用于几何运算中,比如
3D图形应用软件,电脑 游戏,3DStudioMax等软件中。当3D加速卡开
始对Quake类游戏中的纹理进行处理时,整数运算变得不那么急迫了。
此时,更重要的是要加快浮点运算的进程,比如一个浮点矢量和一个
浮点矩阵相乘。下面让我们来看看SSE为开发者提供了什么。

  由于SSE的引入,处理器在原来标准的x87寄存器的基础上,需要8
个新的128位的寄存器。 每个寄存器用来存储四个32位的浮点数。

部分3 部分2 部分1 部分0
                          寄存器7
                          寄存器6
                          寄存器5
                          寄存器4
                          寄存器3
*     *     *      *      寄存器2
2    55.9 -1.9e10 1.567e-6寄存器1
0.7 -100.0  11.2  0.5    寄存器0

  对于四个存储在寄存器里的数字进行算法操作是可行的:你可以对
它们作加减乘除的运算 ,也可以用精确的或近似的算法同时得到四个
平方根。寄存器里的内容可以从一个寄存器 转移到另一个,还可以进
行类似的操作。但是,由于数据的转移并不比数据的加减来得快,SSE
对于处理经过事先特殊打包数据的方法显然更为有效。

  Pentium 4 执行一个SSE操作所花费的时间同执行一个普通指令差
不多。这意味着SSE的优化可以带来四倍的性能提升,如果使用新的大
容量的寄存器,则性能提升更大。但并不是所有运算都可以用SSE来优
化的。一个典型优化的例子就是四维矩阵与四维向量的乘法运算,在这
里你可以轻易的得到四倍的速度提升。

  使用SSE使处理器可以与最新的图形加速器协作,来转化组成三维
场景所用的三角形顶点。由于CPU还有许多其它的工作要做,所以最好
尽可能的减轻其负担,以使其能与3D加速卡相更好的配合。

  那么Athlon XP又如何呢?事实上,这种芯片较普通的Athlon最大
的改进之处在于提供了对SSE的支持。由此我们可以得到两倍于普通程
序代码的性能。然而我们也应该注意到Athlon XP执行普通的代码的效
率也相当高。在分支预测操作上,Athlon XP具有有一定的优势。

  仅使用SSE指令集时,Athlon XP和同频的Pentium 4表现出相近的
性能。但是目前,Pentium 4主频已经大幅领先,这也使得它执行SMID
指令的速度更加快速。

3DNow!和AMD的三个败笔

  现在我们将仔细研究由AMD提出的扩展指令集。它一度被看作SSE
的竞争对手,其实更确切的说,由于出现的较晚,SSE才是真正的挑战
者。在和Pentium II竞争的K6-2-3D处理器中,3DNow!被首次使用,和
SSE一样,它都针对实数进行处理,并被用于图形相关的应用中。

  虽然3DNow!和SSE十分相似,但也存在着许多不同。它们都拥有八
个新的寄存器,但是64位而不是128位。因此它们只能存贮两对数据,
而不是四对。3DNow!可以执行和SSE相似的运算:加/乘/除 两对操作
数,精确或近似(后者执行起来更快)的导出一个(逆)平方根。

部分1     部分0
                寄存器7
                寄存器6
                寄存器5
                寄存器4
*         *     寄存器3
10000.1   6.7   寄存器2
-0.5      1.5e7 寄存器1
2.0       1.0   寄存器0

  由于同时对两对操作数进行处理,3DNow!优化编码的运算速度会
快两倍。由于比SSE提供的支持要少,你不得不优化你的程序,以寻找
最大可能的性能提升,这给软件开发带来了困难。正是这个因素,同
时鉴于Intel在处理器市场上的统治地位,软件开发者中普遍放弃了3DNow!。

  值得一提的是,虽然Pentium III中的SSE指令集只有Pentium 4
中的一半,但这几乎和AMD Athlon 处理器中的3DNow!产生的效果相等。
因此,SSE的强势表现对3DNow的命运产生了消极的影响。

  不过,3DNow!还是提供了一些诱人的特性。其中之一是实现了储存在
一个寄存器中的数据求和。这种灵活性会为许多常见的任务带来便利。比
如当我们计算两个三维向量的标量积时,如果用SSE运算,所得结果会尽
如人意,你将不能将长SSE寄存器的数据求和,而不使用额外的寄存器。
结果是运算速度不但不会加快,有时甚至可能更慢。并且标量积在计算中
非常常见,尤其是在求两点间距离时。在这种情况下,灵活性更高的3DNow!
更显优越。

  3DNow!另一个优点是借助于编译器可以实现更高效的自动优化。SSE
则因为更多的寄存器数量而显得臃肿,这不利于编译器的自动优化。3DNow!
编译器有可能将使某些浮点运算的运行速度提高1.5倍。但是AMD并没有实
现这一点,随着SSE编译器日益流行而3DNow!则渐渐被人遗忘,AMD不得不
使用Intel的编译器来优化它的测试程序。

  软件开发者并不热衷于为Athlon CPUs优化他们的程序:Intel处理器
已经足以让他们头疼了。由此产生的后果:如果一个程序完全没有SIMD优
化,那么Athlon胜出Pentium 4,如果应用程序为SSE2优化,那么Athlon
必然落败。

  总的来看,AMD在3DNow!上犯了一个错误,它并没有得到积极的推广,
在比较流行的3DNow!应用中,OpenGL驱动是成功的一例,它使AMD平台获
得了显著的性能提升。我们认为既然AMD无法将它的指令集发扬光大,他
们就应该在他们的处理器中认真贯彻Intel的技术。如果Athlon XP中能够
实现,哪怕是以较低的效率,这也足以使它成为一款近乎完美的产品。

  值得关注的是,AMD Athlon 64仍将具有3DNow!的特征。因此SSE2和
3DNow!有机会再次一较高下。

SSE2

  纵观目前市场上的x86处理器,SSE2是最新一代的SIMD扩展指令集。
上面我们已经讨论了它的整数运算部分。但SSE2不仅仅只有整数指令。
它的八个128位寄存器并不单单理解为可以存储四个32位浮点数,同时它
也可以存储两个更为精确的64位浮点数。当原精确度的运算出现太大误
差时,更精确的数据就会被使用。SSE运算现在运用于两对操作数的运算,
而不是四对。这样,平方根的近似计算也就不可能实现了。

部分1     部分0
                寄存器7
                寄存器6
                寄存器5
                寄存器4
                寄存器3
*          *    寄存器2
-1.5e10  0.00001寄存器1
1e-25    5.5    寄存器0

  虽然我们现在得到了一种3DNow! 的模拟运算,但储存在寄存器中
的数据却失去了灵活的加法运算。同时,如果你需要SSE2的高精度,那
就只能得到双倍的性能增长。

  我们可以整合出一套标准来评估大运算量的程序。如果程序是经
SSE2优化的,那么它在Pentium 4上会比Athlon XP运行地更快。若未
经特殊优化,仅凭各自速率的话,Pentium 4将不敌Athlon XP。


--
提供刻录服务,带CD盒每张4元,全部用BENQ。
上传到192.168.39.98用户upload密码408
工作时间为周一至周五中午和晚上,周六日休息。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.39.98]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店