详谈陌生的SIMD和熟悉的SSE指令集

互联网 | 编辑: 李凯男 2008-02-28 11:30:00原创-特约 返回原文

随着45nm制造工艺的Intel Penryn处理器的发布(包括双核心桌面处理器Wolfdale、四核心桌面处理器Yorkfield、双核心移动处理器Penryn等家族成员),一个新的名词又频繁地出现在我们眼前,这就是SSE4(Streaming SIMD Extensions,流指令扩展指令集),或者更准确的说法SSE4.1。

SSE:为多媒体而发明的那剂“药”

《电脑报》硬件评测周刊将与PChome强强联合,深入合作,推出一系列硬件技术类文章。主旨在于更好地在中国普及IT知识,吸引更多的人来关注IT硬件领域的产品、技术及整个业界动态。为中国IT事业的发展贡献自己的一份力量。今EW评测室转载《电脑报》一文,原文如下:

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

SSE:为多媒体而发明的那剂“药”

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

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

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指令可以节省大量计算时间。

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的作用大打折扣,甚至有时还会造成性能的瞬间剧降。

SSE指令集在不断地扩充

Intel没有沿用MMX的称呼,1999年的Pentium Ⅲ处理器上指令集改称SSE。SSE采用了单独的寄存器,解决了与FPU冲突的问题。8个128位单独的SSE寄存器,支持同时处理 4 个单精度浮点数,能够同时处理的数据比64位的MMX翻了一倍。SSE一共有70条指令,进一步提升了CPU多媒体处理能力。也从这时开始,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进行了优化,却没有大肆宣扬。

TMPGEnc支持完整的SSE指令

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

分分合合的AMD处理器

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

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

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只有一直服用下去了。

更多精彩的最新配件资讯,请点击进入硬件中心

大家如果对本栏目有任何建议、意见或任何IT配件资讯的投稿,欢迎发邮件到li.kainan@pchome.net,我们会尽快给予回复。最后,硬件频道全体同仁感谢大家对PChome一贯的关注和支持!

返回原文

本文导航

相关阅读

每日精选

点击查看更多

首页 手机 数码相机 笔记本 游戏 DIY硬件 硬件外设 办公中心 数字家电 平板电脑