MMX 和SSEsse4.1指令集集的区别是什么

X86,MIPS和自有指令集有什么不同?
MIPS的演化
MIPS16是一个1997年面世的可选的指令集扩展,它能减少二进制程序尺寸的30-40%。实现者希望这种CPU能够在很关心代码尺寸的场合中更有吸引力--这种场合通常就是指低成本系统。由于只应用于特定实现,它是一个多厂商标准:LSI,
NEC和Philips都生产支持MIPS16的CPU。
在前面1.2节中我们说过,使MIPS二进制代码比其他架构的并不是MIPS指令集干的活少了,
而是他们的尺寸更大一些--每个指令4字节长,相比之下某些CISC架构一般平均只有3个字节。
MIPS增加了一种模式,在这种模式下CPU可以对16位固定大小的指令进行解码。大多数MIPS16指令扩展成正常的MIPS
III指令,所以很明显这将是一个相当受限制的指令子集。窍门就在于使这个子集对足够多的程序充分的进行高效编码,以使整个程序的大小得到大大的压缩。
当然,16位指令并不会使其变成一个16位指令集。MIPS16 CPU是实际存在的带有32位或者64位寄存器的的CPU,MIPS16
CPU的运算也都在这些寄存器上。
MIPS16远不是一个完整的指令集—例如它既没有CPU控制指令,也没有浮点运算指令。但没有关系,因为每一个MIPS16
CPU也必须要运行完整的MIPS
ISA。你能运行MIPS16和正常的MIPS代码的混合指令。每个函数调用或者跳转-寄存器指令都能改变运行模式。
1.并不是MIPS发明了提供一种可选的使部分指令只有一半大小的创意。Advanced RISC
Machine(ARM)公司的Thumb版本的ARM CPU首先提出这个想法的。
在MIPS16中把指令地址编码成最低有效位(Least Significant Bit,
LSB)模式是既方便又高效的。MIPS16指令必须偶字节对齐,所以bit 0不再是指令指针(instruction pointer,
就是程序计数器PC)的组成部分了;取而代之的是,每条跳到奇数地址的指令开始执行MIPS16,每条跳到偶数地址的指令回到正常的MIPS。MIPS子程序调用指令jal的目标地址总是字对齐的,所以新指令jalx隐藏了指令的模式间转换。
为了把指令压缩到一半大小,对于大多数指令我们只分配了3
bit来选择寄存器,这样只有8个通用寄存器允许自由访问;在许多MIPS指令中可以见到的16 bit常数域也被压缩,通常变成了5
bit。许多MIPS16指令只指明两个寄存器,而不是三个。另外,还有一些特别的编码规则将在下一节描述。
D.1.1 MIPS16中的特殊编码格式和指令
被缩减的通用指令没有什么问题,但有两个特定的弱点会加大程序尺寸;5
bit的立即数域构造常量是不够的,在load/store操作中也没有足够的地址范围。三种新的指令和一种特别规定有助于解决这些问题。
extend是一条特殊的MIPS16指令,它由5 bit的代码和11 bit的域构成。这个11
bit的域可以和后续指令中的立即数域相连接,这样就允许使用一个指令对来对16
bit立即数编码。这条指令在汇编语言中看起来就像一个指令前缀。
装载(load)常量在正常的MIPS模式下都需要额外的指令,在MIPS16模式下更是巨大的负担;把常量放在内存中然后再读它们会更快一些。MIPS16对相对于指令自身位置的装载操作(PC-relative
PC相关装载)增加了支持,允许常量被嵌到代码段中(典型情况就是在函数的起始处前面)。这些是仅有的不是严格对应于正常的MIPS指令的MIPS16指令—MIPS没有PC相关的数据操作。
许多MIPS load/store操作是直接在栈帧(stack
frame)里,$29/mp可能是最普通的基寄存器。MIPS16定义了一组隐式使用mp的指令,允许我们把函数的栈帧引用地址也编进去而不需要一个分离的寄存器域。
MIPS的Load指令总是生成32位的全地址。由于装载字(load
word)指令只有当地址是4的倍数是才合法,最低两位就被浪费了。MIPS16的Load指令是可以伸缩的:地址的偏移量会根据被load/store的对象的大小左移,这样就增加了指令中可用的地址范围。
作为一种额外的应急机制,MIPS16定义了一些指令,允许在8个MIPS16可访问的的寄存器中的一个与32个MIPS通用寄存器中的任何一个间任意做数据移动。
D.1.2 对MIPS16的评价
MIPS16对于汇编语言编程来说不是一种合适的语言,我们也不准备对它详细说明。这些是编译器的工作。大多数使用MIPS16模式编译的程序的尺寸都会缩小到用MIPS模式编译的
60-70%。MIPS16比32位CISC架构的代码更紧凑,和ARM的Thumb代码差不多,和纯16位CPU相比相当有竞争力。
但是没有免费的午餐;MIPS16程序可能比MIPS增加40-50%的指令。这意味着在CPU核上运行一个程序会多用40-50%的时钟周期。但是低端CPU经常主要被存储器所限制,而不是被CPU核所限制。较小的MIPS16程序需要较低的带宽来取指令,这样就得到更低的cache缺失率。在cache很小并且程序的存储器有限时,MIPS16将会弥补差距,还有可能要重新改写正常的MIPS代码。
由于性能的降低,MIPS16代码在有大的存储器资源和很宽总线的计算机中没有吸引力。这就是为什么它只是一种可选扩展的原因。
在应用范围的另一端,
MIPS16将会与软件压缩技术展开竞争。在放进ROM存储器之后,使用通常的文件压缩算法压缩的正常MIPS程序将会比未压缩的同等MIPS16代码小,而稍大于压缩过的MIPS16同等代码(注1);如果你的系统拥有足够的内存能够把ROM当做文件系统使用,而把代码解压缩到RAM中执行,那么全ISA软件解压很可能会带来更好的总体性能。
也有这样一种趋势来构造系统,那就是大量使用以字节编码的解释语言(Java或者它的后续者)来书写大量在时间上要求不严格的程序。那种中间代码非常小,在尺寸方面比任何二进制机器码都高效的多。如果只有解释器和一些对性能要求严格的程序留在机器中ISA中,那么更密集的指令集编码格式将只会影响程序的一小部分。当然解释器(特别是Java)本身会非常大,但是应用复杂度的无情增长将很快使它减少重要性。
我预料在年将会看到MIPS16小范围的应用于低能量、小尺寸和成本受限制的系统中。它还是值得发明的,因为有些系统—比如”智能”移动电话—可能会大量生产。
-------------------------------------------------------------------------------------------------------
1.更密集的编码格式在使用上比压缩算法有更低的冗余度。
D.2 MIPSV/MDMX
V和MDMX是在1997年早些时候一起公布的。它们本来是为一种新的准备在1998年发布MIPS/SGI的CPU中的指令而设计的。但是那个CPU后来被取消了,关于它们的未来存在疑问。
二者都是为了克服一些已知的传统指令集的不足,这些不足是在ISA面向多媒体应用中产生的。象软调制解调器的语音编/解码、或流媒体应用、或图像/视频的压缩/解压缩这样的任务采用一些过去只有专用数字信号处理器(digital
signal processor,
DSP)才用的数学算法。在这种计算等级,多媒体任务通常都包括重复进行一些对大向量或者数组数据的相同操作。
在基于寄存器的机器内部,通常采用的方案是把多媒体数据项封装到一个机器寄存器中,然后执行一条寄存器-寄存器指令,这条指令对于每个寄存器中的每个域做同样的工作。这是一种非常明显的并行处理形式,被称为单指令,多数据(single
instruction, multiple data. SIMD)。
这个想法首先见于一款Intel的业已消失的i860架构的微处理器(circa 88)中。作为对Intel
x86指令集进行扩展的MMX在1996年投放市场后,SIMD重新登场时更加引人注目。
MDMX对操纵在一个64位寄存器中8x8-bit的整数组提供了一组操作,这些操作能够对所有的8小片做同样的事情。这些指令包括通常的算术操作(加,减,乘),也有乘法-累加指令能把结果放在一个巨大的累加器中,这个累加器有足够的精度防止溢出。
由于这些指令被用于特定数据类型被相当清楚的从正常的程序变量分离开来的场合中,MDMX指令集与浮点寄存器一起工作就变得有意义。以这种方式重复利用现有的寄存器意味着现有的操作系统不需要改变(在任务切换时操作系统已经保存和恢复浮点寄存器了)。
与MDMX相似,Intel的MMX为封装进一个64bit的8个8bit数提供了”octibyte”八路(eight-way)指令。MIPS
MDMX也定义了4x16位(四个短整数操作)和2x32位(两个字操作)格式,但是早期的情况是一些MDMX实现可能认定octibyte格式和指令足够了。
当对8bit的数做算术运算时,
结果经常下溢和上溢。如果我们必须为众多的溢出测试条件编写处理程序,那么多媒体应用的性能将不会得到提高。而只简单截去最大的和最小的数(对于无符号8-bit数来说,就是255和0)的上溢和下溢结果,对于机器运算来说会更加有帮助。这个处理过程叫做”饱和”(saturating)算法。MDMX拥有这种能力。
这就给我们带来了MIPS V。尽管从名字上看好像意思是指一个升级的指令集--就像MIPS I到IV那样,MIPS
V在浮点领域跟MDMX很相似,提供了paired-single操作。paired-single对一对被封装进64-bit的浮点寄存器中的单精度数做两次FP动作。
MIPS V没有MDMX那么古怪;MIPS
IV包含了一个相当广泛的浮点运算集合,并且直接为其中的绝大部分提供了paired-single版本的指令;甚至成对比较(paired-compare)也可以做到,这是因为MIPS
IV的CPU已经有了多个浮点条件位来接收结果。但MIPS
V没有提供复杂多周期指令的成对操作版本的指令,这些多周期指令会需要非常多新的资源(例如没有求平方根和除法)。
D.2.1 编译器能用多媒体指令吗?
引入SIMD多媒体指令的原因和70年代晚期以前在超级计算机中提供向量处理单元的原因相似。很容易为向量处理器构造一个手工矩阵算术包。而用向量运算来编译一个用高级语言写成的程序就难得多了,尽管超级计算机提供商在这上面也取得一些成果。通常这些成果都集中在Fortran上;对于常规编程来说语义上的弱点使Fortran成为一种可怜的语言,但是这让它变成了一种很容易优化的语言,因为边际效应非常明显。
人们一致认为向量化的Fortran编译器在旧的程序上工作的不是很好(“dusty decks”,
一句迷人的Fortran行话)。这样的编译器要求编程人员书写或者修改程序中的循环来使适应优化器的要求,这样才能带来显著的好处。这样可能是一种好的分工:循环可以使用固定格式,但程序员还可以将它们理解为顺序代码,但实际上这些循环编译的结果是一些很难懂的并行代码。术语”optimizer
friendly”是含糊不清的:并行处理理论将会把它定义为:
“特定种类的边际效应的缺少,尽管实际的编译器可以查找遵循一些严格的多的规定的循环,这样哑模式匹配器就可以将它们安全的识别出来,然后进行向量化处理”。
C的向量化困难的多。这是因为它使用的内存和基于指针的模型,这种模型对于任何数组访问都是隐式操作的。这使得除了最简单的循环以外很难消除其他的边际作用。在产品化上还没有做多少工作。
由于这段历史,开发能够采用多媒体SIMD指令成功优化程序的C/C++编译器的前景如何呢?我猜测在最近前景不好。Intel的MMX是最广泛使用的现代SIMD指令集,但当前也只有汇编语言用户才会使用(注1)。我不希望看到使用x86
MMX的编译器。如果MMX得到大规模的成功使用,并且依赖于汇编子程序,结果就会是这些程序被x86架构所束缚住了;this would
hardly be something that Intel would be in a hurry to change.
很多人预测在1998年或者1999年Intel会引入一种更好的ISA扩展。这种扩展将会增加更多的数据格式到”MMX的后代”中,包括成对的单精度浮点数。如果这种能力更强的指令得到编译器的支持,那就可能出现很多同时适用于MIPS
D.2.2 使用MDMX的应用程序
就像x86 MMX,
MDMX对3D图像和视频应用将会比较有用,在这些应用中CPU把像素值推给软调制解调器所需的低精度信号处理单元。
不幸的是,”near
display”3D渲染的性能依赖于谨慎的与显存的集成。甚至配置很好的CPU也竞争不过廉价的PC世界的加速器,这些加速器与大显存之间无缝结合(注2)。图像和视频处理应用确实在这个等级上运行访问像素的程序,尽管这些这都是些桌面PC应用。
软调制解调器可能对那些希望使用电话的低端消费品设备会比较有用。它们和便宜的集成式调制解调器设备展开竞争,在更大范围里它们要与不断发展的进入家庭的数字电话竞争。
在我看来MDMX在游戏控制台上与CPU/视频系统紧密结合将会是最好的机会。
D.2.3 MIPS V的应用
成对单精度浮点指令和格式是为在高端图像和多媒体应用中出现的重复浮点计算增加带宽。尽管看起来象是硅图像公司(SGI)的市场,3D图像使用的增长会使这种能力在更广的范围里更有有用。
对于MIPS有限的编译器支持看起来比对MDMX的支持更为真实。尽管成对操作看起来好像是超标量CPU的双发射指令的一种替代,它们实际上是相互补充的。SIMD指令采用的并行机制来自于编译器中的更高一级操作,而低级调度还可以可能同时发射两条指令:一条对式浮点指令,另外一条指令负责整数或者管理操作。
----------------------------------------------------------------------------------------------------
1.一个愤世嫉俗的人可能会说由于任何x86的克隆都需要MMX,那么MMX够用了。他还会说MMX到底是不是真的在用的问题已经离题太远了。而且从中受益的游戏和图像程序都是那些疯狂的汇编爱好者编写的。
2.如果有人使用与大内存和集成式视频刷新数据通道无缝结合的方式构造CPU的话,它们还有可能展开竞争。但是我没有看到那种MIPS产品的更多迹象。
D.2.4 MDMX/MIPS V有可能成功
SGI 1997年做出的放弃发展它的H1高端处理器项目的决定使这两种指令集(译者注:MDMX 和MIPS
V)一直没能正式发布。但是我相信至少有一种面向嵌入式市场的CPU会支持MDMX。到底会发生什么是很有趣的。
在目前为止没有CPU支持MIPS V;但是它比MDMX有更长的生存周期,将还会是1999年发布的CPU有用的附属物。
(1)CISC指令集
  CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set
Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是现在新起的X86-64(也被成AMD64)都是属于CISC的范畴。
要知道什么是指令集还要从当今的X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将X86指令集和X87指令集统称为X86指令集。
虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到过去的PII至强、PIII至强、Pentium
3,最后到今天的Pentium
4系列、至强(不包括至强Nocona),但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel
X86系列及其兼容CPU(如AMD Athlon
MP、)都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器CPU两类。
(2)RISC指令集
  RISC是英文“Reduced Instruction Set Computing ”
的缩写,中文意思是“精简指令集”。它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本高。并且复杂指令需要复杂的操作,必然会降低计算机的速度。基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU
,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。RISC指令集是高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。目前在中高档服务器中普遍采用这一指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的操作系统UNIX,现在Linux也属于类似UNIX的操作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容。
目前,在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器。
(3)IA-64
  EPIC(Explicitly Parallel Instruction
Computers,精确并行指令计算机)是否是RISC和CISC体系的继承者的争论已经有很多,单以EPIC体系来说,它更像Intel的处理器迈向RISC体系的重要步骤。从理论上说,EPIC体系设计的CPU,在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得多。
Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器,也是IA-64系列中的第一款。微软也已开发了代号为Win64的操作系统,在软件上加以支持。在Intel采用了X86指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是,它们想摆脱容量巨大的x86架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了。IA-64
在很多方面来说,都比x86有了长足的进步。突破了传统IA32架构的许多限制,在数据的处理能力,系统的稳定性、安全性、可用性、可观理性等方面获得了突破性的提高。
IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium、Itanium2
……)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码的最好途径(最好的途径是直接在x86处理器上运行x86代码),因此Itanium
和Itanium2在运行x86应用程序时候的性能非常糟糕。这也成为X86-64产生的根本原因。
&(4)X86-64 (AMD64 / EM64T)
AMD公司设计,可以在同一时间内处理64位的整数运算,并兼容于X86-32架构。其中支持64位逻辑定址,同时提供转换为32位定址选项;但数据操作指令默认为32位和8位,提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位运算操作,就要将结果扩展成完整的64位。这样,指令中有“直接执行”和“转换执行”的区别,其指令字段是8位或32位,可以避免字段过长。
& x86-64(也叫AMD64)的产生也并非空穴来风,x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86。AMD充分考虑顾客的需求,加强x86指令集的功能,使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64。在技术上AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作为原有X86处理器寄存器的扩充,但在而在32位环境下并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位。在SSE单元中新加入了8个新寄存器以提供对SSE2的支持。寄存器数量的增加将带来性能的提升。与此同时,为了同时支持32和64位代码及寄存器,x86-64架构允许处理器工作在以下两种模式:Long
Mode(长模式)和Legacy
Mode(遗传模式),Long模式又分为两种子模式(64bit模式和Compatibility
mode兼容模式)。该标准已经被引进在AMD服务器处理器中的Opteron处理器。
  而今年也推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E,这是英特尔64位扩展技术的名字,用来区别X86指令集。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。SSE4指令集_百度百科
SSE4指令集
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来&KNI&指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的&MMX2&则完全是硬件评论家们和媒体凭感觉和印象对&KNI&的 评价,Intel公司从未正式发布过关于MMX2的消息。
SSE4指令集简介
的英文全称是:Streaming SIMD Extensions 4,是自从SSE2之后对ISA最大的一次的升级扩展。新指令集增强了从多媒体应用到高性能计算应用领域的性能,同时还利用一些专用电路实现对于特定应用加速。
SSE4指令集指令数目
而最终推出的SSE指令集也就是所谓胜出的&互联网SSE&指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)指令、12条MMX 整数运算增强指令、8条优化内存中连续传输指令。这些指令对流行的图像处理、、3D运算、、音频处理等诸多多媒体应用起到全面强化的作用。S SE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期多个浮点数据来有效地提高速度。[1]
4.1将包括47条指令,4.2将包括7条指令。[2]
实际上,SSE4指令集并不能完全说是一个独立的新技术,因为它是集成在之中,可以说是处理器众多新技术之一。但之所以将其单独拿出来为大家解析,主要是考虑到随着人们生活水平的提高和奥运的临近,大家对于播放和解压的要求也越来越高。因此在本页中,编辑将详细为大家介绍SSE4指令集的特点,并加以相应的测试。
SSE4指令集内容
SSE4:全名为Streaming SIMD Extension 4,被视为继2001年以来最重要的媒体的改进,除扩展Intel 64外。
据了解,SSE4将分为4.1版本及4.2版本,共新增47条指令,指令如右图:
据Intel官方数据显示,近期与多间软件公司全力合作,2008 年第一季将有21款软件支持SSE4指令集,包括影像编码及播放软件、数字影像内容处理软件及3D核心,性能提高20%至110%不等。
IntelSSE4 由一套全新指令构成,旨在提升一系列应用程序的性能和能效。Intel SSE4 构建于64(Intel64 ) (ISA)。Intel SSE4 是与其独立软件开发商 (ISV) 团体精诚合作的成果,它可以支持开发人员轻松改进产品,同时保持必要的应用级,以适应不断迭代的需求。
自1999年问世以来,已经经过了九年的时间。[3]
Penryn 支持 47 条 IntelSSE4 指令,包括编译器和媒体加速器指令。未来的将支持其余指令,而软件也将能从程序的角度检测出支持哪些 Intel SSE4 指令。
从指令数目上看,SSE4指令增加了的指令改进了整数和浮点操作。SSE4指令集将分为两个版本:4.1和4.2,SSE4.1版本随着45nm Penryn发布,而SSE4.2版本将会随着下一代架构Nehalem发布。[4]
Penryn处理器SSE4指令集解析
Penryn搭载了最新的SSE4指令集,SSE4(Streaming SIMD Extensions 4)是自从SSE2之后对ISA扩展指令集最大的一次的升级扩展,它将会随着Penryn处理器陆续应用于平台、移动平台和服务器中……
它将会随着Penryn处理器陆续应用于平台、移动平台和服务器中。据目前所致,SSE4包括大约50条新指令,Penryn通过这些新指令集,增强了从媒体应用到高性能计算应用领域的性能,同时还利用一些专用电路实现对于特定应用加速。
从指令数目上看,SSE4的47条指令增加了的指令改进了整数和浮点操作。支持DWORD和QWORD操作,新的单精度FP操作、快速寄存器操作、面向性能优化的内存操作等等,包括了图形、图像、数据装载各方面的革新,因此称其为SSE2以来最大的指令集变动也是不为过的。利用支持SSE4指令集的编译器编译之后,包括图形/图像处理、视频处理、2D/3D创作、多媒体、游戏、内存敏感负载、高性能计算等应用都会受益。
SSE4指令集的具体指令如下图所示,按照目前的资料,SSE4指令集还将分为两个版本:4.1和4.2,SSE4.1版本将随着45nm Penryn发布,而SSE4.2版本将会随着Penryn的下一代Nehalem发布,4.1将包括47条指令,4.2将包括7条指令,因此下图的指令数目实际上并不是47,未来的SSE4.2指令数目也可能会有变动。
对于Nehalem的SSE4.2,Intel的Gelsinger介绍说,这7条指令集的用途各有不同,比如有面向CRC-32和POP Counts等特定应用的,有特别针对XML等的流式指令。Gelsinger称,新指令集可以将256条指令合并在一起执行,从而让XML类工作的性能提高3倍。
SSE4——Penryn搭载的SSE4.1指令集主要分为三个部分,分别是SSE4视频编码加速部分、SSE4图形加速部分和SSE4流加载部分,其中SSE4视频编码加速部分包括了14条指令,用于加速4x4绝对差和、子像素过滤一击方面的性能。
在进行视频编码时,需要进行大量的Motion Estimation(动态预测),动态预测是视频编码过程中极其重要的一个环节,它的对整个编码效率有很大的影响,而这个动态预测需要进行大量的SAD(Sums of Absolute Difference,差分绝对值和)的运算,该运算是大部分视频编码算法中一步常采用的方法。SAD算法将会在相邻两个连续帧中找出一个大块的运动情况,以纪录其运动数据代替纪录像素数据而节约存储容量、压缩视频。为此,SAD需要计算两个大块中每一组对应的像素值之间绝对差值的累加和。这本身就是一个非常复杂的量运算动作,即使依靠SIMD指令的一条指令就处理大量数据的优势,要组合成SAD操作代码也需要大量的指令。
现在,SSE4指令集内特别加入了SAD加速运算指令,只需要一条指令就可以快速高效地完成这些工作。例如,在SSE4之前,一个SAD工作代码如下:
非常的冗长繁琐,而在有了SSE4之后,这些指令就可以简化为一条指令:
MPSADBW xmm0,xmm1,0
SSE4指令集指令集架构
据了解,SSE4 指令集全名为全名为Streaming SIMD Extension4,被视为继2001年以来最重要的媒体指令集架构的改进,除扩展 Intel64 指令集架构外,还加入有关图形、视频编码及处理、三维成像及游戏应用等指令,令涉及音频、图像和数据压缩算法的应用程序大幅受益。在影像编码及播放软件方面,除了DivX、Pegasys TMPEGenc Xpress及Microsoft Media Encoder已支持SSE4,但在 2008 年第一季将有Mainconcent H.264 Encoder、Arcsoft Video Cleaner 、WASP 3D 、CyberLink Power DVD Ultra 、CyberLink Power Director 、Intervideo DVD Copy 、Mainconcent H.264Decoder 、Sony H.264 Encoder/Decoder 及 Unlend DMF6 追加支持 SSE4,令 Intel 45 nm Core2在影像编码及播放效能,有更大优势。在数码内容处理软件方面,将有Sony Media SW Vegas 8.0b、Adobe Premiere Pro CS3、3ivx Video Author、 nlet's Fathom、Arcsoft Media Converter、Ulead Video Studio及Image Anlyzer追加SSE4支持,预计在2008年第一季推出。在方面,将有2款游戏支持SSE4,包括NC Soft Lineage II及Scale Form,但Intel不讳言SSE4对于游戏的增长比较细,相信不会有太多软件公司在游戏核心引擎内加入SSE4支持。根据Intel最新规划,SSE4 将分为4.1版本及4.2版本,共新增 47 条指令,主要针对向量绘图运算、3D加速、视像编码加速及协同处理加速动作,下一代 45 nm Nelahem将会追加SSE4.2 版本,合共 54 条指令。[5]
SSE4指令集历史发展
SSE4指令集发展历史
首先还是让我们回顾一下集成指令的历史,之后再引出SSE4指令集的诞生。自奔腾MMX开始,处理器新加入了(Single Instruction Multiple Data)。该指令集可以把多批次的指令组编辑成为一条单一的指令,从而达到提升数据处理的能力。集成MMX指令的奔腾主要用作提升多媒体数据的处理能力,共有57条指令。
后来,于1999年发布了基于MMX指令的SSE指令集,全名Streaming SIMD Extensions。首颗支持SSE产品Pentium III,除新增70条指令之外,还进一步提升了多媒体数据的处理能力,最重要的是解决了MMX指令与浮点指令不能同时处理的问题。而随后
在2001年发布的2指令集,又在原来的基础上增加了144条新指令。其中除了主要负责64位双精度浮点数及整型运算和对Cache控制延迟降低两部分之外,更重要的是完全解决了SSE指令集需要占用浮点数据问题。
时间前进至2004年,以Prescott为核心的奔腾4加入了SSE3指令集,新增指令仅13条,主要是对水平式整数的运算,可对多笔数值同时进行加法或减法运算,令处理器能大量执行DSP及3D性质的运算。此外, SSE3更针对多线程应用进行最佳化,使原有的Hyper-Theading功能获得更佳的发挥。
SSE4指令集补充版本
作为SSE3指令集的补充版本,SSSE3出现在我们已经相对比较熟悉的微架构中,新增有16条指令,进一步增强CPU在、图形图像和Internet等方面的处理能力。而方面本来是计划将该16条指令收录在后来的SSE4指令集中,但考虑到当时硬件升级速度的大幅提升,最终决定提早加入至产品中。
接下来就是我们本页的主角SSE4指令集了。正如之前业界所盛传的那样,SSE4指令集被视为自2001年以来最重要的媒体指令集架构改进。除了将延续多年的32位架构升级至64位之外,还加入了图形、、处理、三维成像及应用等众多指令,使得在音频、、数据压缩算法等多方面性能大幅度提升。
不过与以往不同,将SSE4分为了4.1和4.2两个版本,因此所看到的Penryn核心中,只集成了版本。而至于.2,公司应该也会在不长的时间里为我们带出。那么新的SSE 4.1指令集拥有哪些特别之处呢?一起来看看吧!
SSE4指令集新增指令
SSE 4.1版本的指令集新增加了47条指令,主要针对向量绘图运算、3D游戏加速、视频编码加速及的加速。方面指出,在应用SSE4指令集后,Penryn核心额外提供了2个不同的32位向量整数乘法运算支持,并且在此基础上还引入了8位无符号最小值和最大值以及16位、32位有符号和无符号的运算,能够有效地改善编译效率,同时提高向量化整数和单精度运算地能力。另外,SSE4.1还改良了插入、提取、寻找、离散、跨步负载及存储等动作,保证了向量运算地专一化。
SSE4.1还加入了6条运算指令,支援单、双精度地及浮点产生操作。其中EE 754指令可实现立即转换运算路径模式,大大减少延迟,保证数据运算通道的畅通。而这些改变,对于进行3D和相关的图形制作是具有相当深远的意义。除此之外,SSE4.1指令集还加入了串流式负载指令,可提高图形帧缓冲区的读取数据频宽,理论上可获取完整的行,即单次性读取64位而非原来的8位 ,并可保持在临时缓冲区内让指令最多带来8倍的读取频宽效能提升。对于与之间的数据共享起到重要作用。
SSE4指令集方便性
简化量是非常巨大的。而在复杂的动态预测程序中,要执行复杂的SAD代码,这时SSE4还可以额外提供更高的方便性:
SSSE3可以看作是SSE4的一个提前“泄露”的子集,同样的工作,右边的SSE4代码无疑要比SSSE3更为简捷。
SSE4当中还加入了快速查找的指令,虽然并不仅仅是视频编码才能具有作用,然而对于整位像素和子像素方面具有特别好的效果,如下图的指令可以在8个元素中找到最小的一个元素,并找到其位置:
在Intel的SSE4展示当中,使用搭载SSE4指令集的2.66G Wolfdale Core 2系统对比2.33G Core 2 Duo E6550进行Pegasys TMPGEnc 4.0 XPress HDTV编码,最后得到了55%的性能提升,其中加速的SAD处理和快速查找在各自的领域的性能提升达到了2~3倍,SSE4指令集的作用可见一斑:
其中,CPU的频率提升只有14%,总应用程序提升却达到了55%,这就是SSE4视频编码加速指令的作用了。
SSE4图形加速部分包括了32条指令,包括了图形构造上的大量基本操作指令:点积、双字节乘积、非单位步长存取等,并对现有指令的交叉支持改进了编译器的向量化,这部分指令相当于重新提供了一个向量化的图形操作基础,可以极大地提升在图形处理方面的能力。
32条指令具体划分6个部分
12条32位向量整数操作,用于提供快速的向量整数运算
7条非单位步长存取操作,提供快速的向量载入/保存
2条点积操作,在构造阵列(Array-Of-Structures)运算中可以提供非常快的点积运算能力
6条变量及立即混合,用于提升传统SIMD代码的性能
1条早期参量输出,可以快速测试128-bit宽度数据
4条浮点取整,用于如Floor()、Ceil(),NINT(),nearbyint()这些经常用到的高级语言代码,提高他们的性能
作为例子,32位向量整数操作指令是当前编程语言原语的向量版本,包括了双字节乘、填充双字节最小值/最大值、DWORD到Word组转换、QWORD比较等指令,右下显示了DWORD到Word组转换使用SSE2和SSE4指令分别编写的情形:SSE4只需要1条,而SSE2需要11条。
SSE4流加载部分虽然只有一条指令,不过其确实具有相当重要的地位。在现有的平台当中,CPU使用Write Combining技术可以实现很高带宽的写入操作,可以通过的方式将图形数据很快地写入到Write Combining并迅速写入内存当中,然而读取却是非常的缓慢,因为Write Combining缓存的读取是缓慢的(没有Read Combining)……读取带宽被限制为800MB/s。
Streaming Load技术就是为了解决这个问题,它提供了一个16位对齐的加载指令,可以快速地对Write Combining内存进行操作,可以以高达8GB/s的速率加载数据至CPU(SSE4架构新增加了一个内部临时来存放这些数据),从而大大提升了GPU-CPU之间的数据带宽。
最后,虽然这个Streaming Load是以为例子,实际上它的工作方式对其他外设也是有用的,这是一个通用性的提高WC内存读取速度的技术。
SSE4指令集技术特色
Intel最新45nm还加入了0.5调节,增加了SSE4指令集,Wolfdale增加了2个不同的32Bit向量整数乘法运算支持,引入了8 位无符号。
基于新一代高-K金属栅极技术的Penryn将采用SSE4指令集,包括47条指令,辅助整体性能有望提升40%,而且可使存取内存的速度度提升9倍。
自1999年多媒体指令集问世以来,其中1999年SSE指令集诞生,包含70条指令。2000年为SSE2指令集,包含有144条指令。2004年为SSE3指令集,包含13条指令。2006年为SSSE3指令集,包含32条指令。SSE4延续了多媒体指令集的发展。
SSE4指令集中有14条用作视频加速,32条指令适用于图形基本指令,还有一条名为Stroaming Load,可使存取内存的速度度提升9倍。应用范围为视频制作、便携式视频设备、视频检索、图形和图像、游戏和物理过程以及芯片加速器等。
在对一段720p规格的H.264高品质短片进行编码测试时,集成SSE4指令集的Yorkfield 3.33GHz处理器比QX6700处理器时间缩短了约40%。
此外,SSE4加入串流式负载指令,可提高以图形帧缓冲区的读取数据频宽,理论上可获取完整的快取行,即每次读取64Bit而非8Bit,并可保持在临时缓冲区内,让指令最多可带来8倍的读取频宽效能提升,对于视讯处理、成像以及与之间的共享数据应用,有着明显的效能提升。
在SSE4指令集中,共引入了47条新的多媒体运算指令。其中一条“streaming load instruction”流加载指令引起了广泛的注意。该指令为16bit同步加载指令,但加载结果将会存储在高优先级的临时流缓冲中,绕过普通的CPU Cache。这一指令将有利于GPU从CPU中高速共享数据,加速图像处理。
从Intel 45nm产品的性能以及规格来看都要比上一代的65nm产品有了长足的进步,同时在潜力上又有了一个质的飞跃。而且由于45nm制程在成本上将会更低,因此在中低端市场的竞争中Intel 45nm制程的新将更具有冲击力。
缺乏SSE4指令集的性能明显下降
以II的SSE4指令集来说,它新增加了47条指令数目,其中包括了图形、图像、数据装载各方面的革新。尤其对视编码和频播放来说,有着相当大的帮助,这一点从很多测试结果中也可以看出,最典型的就是被阉割了SSE4.1指令集的E5200高清测试。
在E5200和E7200这两款将5分钟的1080P片段压缩为分辨率640×480的测试结果中。关闭SSE4.1选项时,两者成绩相当,而当E7200开启SSE4.1选项时,整个编码耗时比E5200减少了53秒之多,如果编码更长时间的高清,可以节省的时间将更为可观。这一测试可以让我们清楚的看到指令集对于应用的帮助。
指令集可以极大提高的性能
电脑用户最迫切需要的是解码能力和优秀的3D计算能力,如果指令集加强了对高清解码以及3D游戏的性能优化,那么在执行相关程序时,性能将会有大幅度的提升。
从的指令集发展来看,指令集的每一次进化会带来多媒体娱乐上相当大的变化。Intel第一次在奔腾中加入MMX指令集就让许多用户为之一振,利用MMX指令集直接就可以对MP3和VCD进行解码,而无需使用之类的产品了。随后的SSE系列指令集和3DNOW!指令集都有对和进行优化,使得的多媒体性能越来越好。如今,Intel 45nm的II整合了全新的SSE4指令集,而AMD羿龙处理器具备了SSE4A指令集,这两款全新的指令集都对高清解码进行了大幅度的优化。比如其中的SSE4指令集进一步加强编码效果,可同时处理8个4-byte宽度的SAD运算,这也是Intel宣称软解高清视频同样可以获得流畅、高质量播放效果的原因,可以说彻底的将处理器带入了高清时代。
SSE4A兼容于SSE4
关于AMD SSE4A和INTEL SSE4的区别有两种说法,Intel在对45nm Penryn的设计中加入了SSE4.1指令集,AMD也在Stars架构中加入了SSE4A(之前为SSE128),两者并不兼容,SSE4A的前途并不明朗。
不过后期的说法是SSE4A指令集是针对2007年同期Intel 45nm新推出的SSE4指令集而修改而来,Intel的SSE4会增加48条指令,为了保证和SSE4指令集最大的兼容,SSE4A则去除其中对I64优化的指令,保留了SSE4在图形处理、影音编码、3D运算、等多媒体指令,也就是说两者基本保持兼容,显然这种情况才是和大众更喜欢看到的.因为当支持SSE4的软件检测到CPU支持SSE4的时候,才得以继续安装而不会造成“下一步”是灰色的.
SSE4指令集产品前景
据Intel指出,在应用SSE4指令集后,Penryn增加了2个不同的32Bit向量整数乘法运算支持,引入了8位无符号 (Unsigned)最小值及最大值运算,以及16Bit 及32Bit 有符号 (Signed) 及无符号运算,并有效地改善编译器效率及提高向量化整数及单精度代码的运算能力。同时,SSE4 改良插入、提取、寻找、离散、跨步负载及存储等动作,令向量运算进一步专门化。不仅如此,Intel SSE4指令集还进一步增强讯编码效果,例如可同时处理8个4-byte宽度的SAD(Sums of Absolute Differences)运算,常用于新一代高清影像编码如VC.1及H.264等规格中,令视频编码速度进一步提升。因此在播放高清的时候,即使在的情况下也同样游刃有余。
SSE4指令集应用范围
SSE4 指令集构建于64 指令集架构 (Intel& 64 Instruction Set Architecture) (ISA),该架构是开发 32 位和 64 位应用最为广泛应用的电脑架构。Intel&reg SSE4 包含 54 条指令,主要分为两类:矢量化编译器和媒体加速器,以及高效加速字符串和文本处理。矢量化编译器和媒体加速器可提供高性能的编译器函数库,如封包(同时使用多个操作数)整数运算和浮点运算,可生成性能优化型代码。此外,它还包括高度优化的媒体相关运算,如绝对差值求和、浮点点积和内存负载等。矢量化编译器和媒体加速器指令可改进音频、视频和图像编辑应用、视频编码器、3D 应用和游戏的性能。高效加速字符串和文本处理包含多个压缩字符串比较指令,允许同时运行多项比较和搜索操作。由此受益的应用包括数据库和数据采掘应用,以及那些利用病毒扫描和编译器等分析、搜索和模式匹配算法的应用。[6]

我要回帖

更多关于 sse指令集 pdf 的文章

 

随机推荐