处理器的大脑 读懂CPU指令集

处理器的大脑 读懂CPU指令集

在我们对一款CPU进行全面的了解的时候,我们看看大多数人都遗漏了什么。很多人一般先从处理器的架构开始,看看该处理器采用了什么架构,相比上一代或者竞争对手的CPU在架构上都有什么改进或者优势。

其次,再看这款CPU与同档次的处理器的主频孰高孰低,默认高主频的处理器一般是采用较好的晶圆来制造的,稳定性更好,再次是看该处理器的缓存容量有多少(尤其是Intel的处理器非常依赖缓存),缓存充当处理器与缓存之间的桥梁,起到一定的数据缓冲作用


全面了解处理器

最后我们要看该处理器采用的制程,一般制程越先进,发热量越低,而相对越好超,而比较关注节能性能的网友,还会着重看该处理器的功耗为多少。那么我们看完这些参数是不是漏了些什么呢?

其实仔细想想,我们会恍然大悟,还有该处理器支持的指令集。处理器单靠里面的硬件电路是不会计算的,必须依靠指令来计算和控制系统

● CPU指令集至关重要

每款CPU设计的时候就制定了一套与内部电路配合的指令系统,从具体运用看,我们可以在很多CPU身上看到的就有MMX(Multi Media Extended)、SSE(Streaming SIMD Extensions)、SSE2、SSE3、SSSE3、SSE4(分为SSE4.1与SSE4.2两代,AMD的SSE4A包含在SSE4里面,这个后面会提到),另外还有AMD的3D NOW!系列。

这些指令集可谓大大增强了CPU的多媒体、图形图象和Internet等的处理能力,下面就让我们逐个了解下。


● MMX增强多媒体表现

MMX(Multi Media eXtension,多媒体扩展指令集)指令集是英特尔于1996年推出,主要用于多媒体指令增强。

MMX指令集中包括有57条多媒体指令,通过这些指令可以一次处理多个数据,在处理结果超过实际处理能力的时候也能进行正常处理。MMX的益处在于,当时存在的操作系统不必为此而做出任何修改便可以轻松地执行MMX程序

支持MMX的处理器拥有8个MMX寄存器,每个有64-bit(8byte)的容量。MMX仅支持整数操作,支持1/2/4/8-bytes数据。那即是说,一个MMX寄存器能够储存8/4/2/1个操作。这造成了MMX指令集与x87浮点运算指令不能够同时执行,必须做密集式的交错切换才可以正常执行,这种情况就势必造成整个系统运行质量的下降。目前AMD和和英特尔处理器都支持这一指令集。
 

3D NOW!加速三维渲染

    3DNow!指令集是由AMD提出的,广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!跟后面提到的SSE非常类似,但也有一些不同。它拥有 8个新的寄存器,却是64-bit的,并非128-bit。这样,它只能存储两个浮点数据,而非四个。

K6处理器开始具有3D NOW!指令集

    3DNow!可以执行操作:相加/相乘 /相除运算,精确或者近似平分根。3DNow!指令集技术其实就是21条机器码的扩展指令集。3DNow!指令集主要针对三维建模、坐标变换 和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来在Athlon上开发了Enhanced 3DNow!。


● SSE加快处理多媒体应用

SSE全拼是Streaming SIMD Extension,中文名称为SIMD扩展流。SIMD英文全称为 Single Istruction Multiple Data(单指令多数据),即一条指令可以完成多个操作。SSE是为提供处理器浮点性能而开发的扩展指令集。

SSE指令集包括了70条指令,其中包含单指令多数据浮点计算、以及额外的SIMD整数和高速缓存控制指令。其优势包括:更高分辨率的图像浏览和处理、高质量音频、MPEG2视频、同时MPEG2加解密;语音识别占用更少CPU资源;更高精度和更快响应速度
 

SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。

SSE(Streaming SIMD Extensions)是英特尔在AMD的3D Now!发布一年之后,在其计算机芯片Pentium III中引入的指令集,是MMX的超集。AMD后来在Athlon XP中加入了对这个指令集的支持。这个指令集增加了对8个128位寄存器XMM0-XMM7的支持,每个寄存器可以存储4个单精度浮点数。使用这些寄存器的程序必须使用FXSAVE和FXRSTR指令来保持和恢复状态。但是在Pentium III对SSE的实现中,浮点数寄存器又一次被新的指令集占用了,但是这一次切换运算模式不是必要的了,只是SSE和浮点数指令不能同时进入CPU的处理线而已。
 

SSE2 更精确处理浮点数

    SSE2是英特尔为了应对AMD的3Dnow!+指令集,在SSE的基础上开发了SSE2,增加了一些指令,使得其处理器性能有大幅度提高。

    最早在Pentium 4处理器的最初版本中引入,AMD后来在Opteron 和Athlon 64处理器中也加入了SSE2的支持。到P4设计结束为止,Intel增加了一套包括144条新建指令的SSE2指令集。SSE2涉及了多重的数据目标上立刻执行一单个的指令(即SIMD)。最重要的是SSE2能处理128位和两倍精密浮点数学运算。

    处理更精确浮点数的能力使SSE2成为加速多媒体程序、3D处理工程以及工作类型任务的基础配置

    SSE2指令集添加了对64位双精度浮点数的支持,以及对整型数据的支持,也就是说这个指令集中所有的MMX指令都是多余的了,同时也避免了占用浮点数寄存器。这个指令集还增加了对CPU快取的控制指令。AMD对它的扩展增加了8个XMM寄存器,但是需要切换到64位模式(AMD64)才可以使用这些寄存器。Intel后来在其EM64T架构中也增加了对AMD64的支持。


● SSE3促进五个应用

SSE3指令集是规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。此外Intel害针对SSE3指令集作了一次额外扩充,那就是SSSE3是,最早内建于Core 2 Duo处理器中。
 

SSE3指令集共分为5个应用层: 第一层是“数据传输”,只有一条指令:FISTTP,它有利于x87浮点转换成整数,并可以大大提高优化的效率。 第二层是“数据处理”,指令共有五条,分别是ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。这些指令可以简化复杂数据的处理过程,由于未来数据处理流量将会越来越大,因此Intel在这里应用的指令集最多、达到了五条。 第三层是“特殊处理”,也只有一条:LDDQU。在这条指令主要针对视频解码,用来提高处理器对处理媒体数据结果的精确性。 第四层是“优化”,共有四条指令,分别是HADDPS,HSUBPS,HADDPD,HSUBPD,它们可以对程序起到自动优化的作用,对处理3D图形相当有用。 第五层是“超线程性能增强”,共有两条针对线程处理的指令:MONITOR, MWAIT,这有助于增加Intel超线程的处理能力、大大简化了超线程的数据处理过程。
 

SSE4.1改进视频处理

    SSE4.1是Intel在Penryn核心的Core 2 Duo与Core 2 Solo处理器时,新增的47条新多媒体指令集,用来加强视频编辑等方面的应用。另外,AMD也开发了属于自己的SSE4a多媒体指令集,并内建在Phenom与Opteron等K10架构处理器中,不过相关应用都差不多,并且无法与Intel的SSE4系列指令集相容。

    据了解,在进行视频编码时需要进行动态预测(Motion Estimation)及差分编码方式去除相邻2张影像之相关性,这是一个非常复杂的运算动作。在没有SSE4指令集时,完成一个步骤需要以下指令语句:

  for (int moveblock=0;moveblock<16;moveblock++)

  for(int line=0; line<16; line++) // Does the 16 pixels large in 4 iteration

  {

  int i=0;

  sum0+=abs( pBlock1[j]-pBlock2)+abs(pBlock1[j+1]-pBlock2[i+1])+abs(pBlock1[j+2]-pBlock2[i+2])+abs(pBlock1[j+3]-pBlock2[i+3]); // Compare with 0 pixel offset

  sum1+=abs(pBlock1[j+1]-pBlock2)+abs(pBlock1[j+2]-pBlock2[i+1])+abs(pBlock1[j+3]-pBlock2[i+2])+abs(pBlock1[j+4]-pBlock2[i+3]); // Compare with 1 pixel offset

  sum2+=abs(pBlock1[j+2]-pBlock2)+abs(pBlock1[j+3]-pBlock2[i+1])+abs(pBlock1[j+4]-pBlock2[i+2])+abs(pBlock1[j+5]-pBlock2[i+3]); // Compare with 2 pixel offset

  sum3+=abs(pBlock1[j+3]-pBlock2)+abs(pBlock1[j+4]-pBlock2[i+1])+abs(pBlock1[j+5]-pBlock2[i+2])+abs(pBlock1[j+6]-pBlock2[i+3]); // Compare with 3 pixel offset

  sum4+=abs(pBlock1[j+4]-pBlock2)+abs(pBlock1[j+5]-pBlock2[i+1])+abs(pBlock1[j+6]-pBlock2[i+2])+abs(pBlock1[j+7]-pBlock2[i+3]); // Compare with 4 pixel offset

    sum5+=abs(pBlock1[j+5]-pBlock2)+abs(pBlock1[j+6]-pBlock2[i+1])+abs(pBlock1[j+7]-pBlock2[i+2])+abs(pBlock1[j+8]-pBlock2[i+3]); // Compare with 5 pixel offset

    sum6+=abs(pBlock1[j+6]-pBlock2)+abs(pBlock1[j+7]-pBlock2[i+1])+abs(pBlock1[j+8]-pBlock2[i+2])+abs(pBlock1[j+9]-pBlock2[i+3]); // Compare with 6 pixel offset

    sum7+=abs(pBlock1[j+7]-pBlock2)+abs(pBlock1[j+8]-pBlock2[i+1])+abs(pBlock1[j+9]-pBlock2[i+2])+abs(pBlock1[j+10]-pBlock2[i+3]); // Compare with 7 pixel offset

  i=4;

  j=moveblock+4;

  …

  … }

  }

  一大串的指令极度浪费处理器资源,而在支持SSE4指令集的处理器上,只需要采用4 SAD运算指令:

  MPSADBW xmm0,xmm1,0

  便完全代替了以上繁复的指令串,大幅提升动态预测(Motion Estimation)及差分编码的运算速度。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部