CPU 微体系结构对浮点运算的影响

   

      第一部分:浮点运算Q&A

      什么是浮点数: 

  

      要了解什么是浮点数,首先要了解什么是整数。数和计算通常是按“整数”或“浮点数”进行划分的。整数计算使用计算的所有位(如32位)记录整数“值”。而浮点计算则使用计算的一部分位表示“值”(如23位),另一部分位表示指数(8位)。由于一部分位用来表示指数,所以浮点计算得出的值可以比整数计算得出的值大很多或是小很多。换句话说,对于给定数量的位,浮点计算的精度没有整数计算高,但浮点计算结果的范围却比整数计算大很多。 

  

      什么是浮点计算精度 

  

      采用浮点计算时,您可以确定记录多少个数。例如,“π”的一个相当长的表示是 3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510。问题是您想/需要记录 π 的几位数?您想让精确度达到多少? 

  

      π的上述值是 51 位数。要将 51 位数表示成二进制数,每位数需要 3.32 位(Log (10)/Log(2) = 3.32),总计需要51 * 3.32 = 169 位。这样位数太多。您使用的位数越多,处理器计算的复杂程度就越高,也就需要更多的内存来存储值,计算所用的时间也就越长(和/或将需要更多的晶体管来执行更大的计算)。由于各计算所需精度不同,因此处理器为不同指令提供不同的精度,从而使编程人员可以确定他们所需的精度。精度级别可分为:单精度、双精度和扩展精度。 

  

      哪些处理器执行单元用于浮点运算? 

  

      大多数人会认为所有的浮点运算都通过处理器中的浮点单元完成。总体说来是这样的,但不是所有的浮点单元都一样,所有的浮点指令也不尽相同。同样,许多人认为所有的SIMD(单指令多数据流)指令都是由SIMD单元完成的。然而事实并非如此。有些SIMD指令执行整数运算,而有些则执行浮点运算。同样,执行浮点运算的SIMD指令使用的执行单元与非SIMD浮点指令(如x87浮点指令)相同。 

  

      何谓不同的浮点指令集? 

  

      在增加MMX或SSE/SSE2/SSE3指令集之前,x86架构中的所有浮点计算都被认为是x87指令。这意味着他们使用特定的80 x87寄存器堆栈并且是80位扩展精度计算。所有x87指令都有一个源和目标操作数(例如单条指令,单个数据)。 

  

      x87寄存器位于堆栈中,而非平面寄存器文件(flat register file)。这意味着,访问x87寄存器要比下述XMM寄存器复杂一些。 

  

      采用MMX技术的英特尔®奔腾®处理器中增加了MMX指令。MMX是第一个增加到x86指令集中的SIMD指令。MMX指令是纯整数运算;不过使用的是80位x87寄存器堆栈。 

  

      英特尔奔腾III处理器中增加了SSE指令集。SSE增加了支持单精度浮点运算能力的SIMD指令,它使用8个新的XMM128位寄存器(在64位模式中运算时,新的处理器中有16个XMM寄存器),它们被布置在一个平面寄存器文件中(这意味着可随时访问任何寄存器,并且不使用x87寄存器所用的堆栈协议)。增加的SIMD整数运算也是SSE指令集的一部分。x87寄存器无需执行SSE浮点指令,但是执行浮点运算的那些SSE指令仍使用x87指令所使用的浮点执行单元(FP-add、FP-Mul和FP-Div)。这意味着您不能同时执行SSE FP-Multiply和x87 FP-Multiply。 

  

      英特尔奔腾4处理器和英特尔至强处理器中增加了SSE2指令。SSE2增加了支持双精度浮点运算能力的SIMD指令,它使用SSE指令所使用的128位 XMM寄存器(增加的SIMD整数运算也是SSE2指令集的一部分)。许多新的SSE2指令与原来的MMX指令相似;但是新的SSE2指令能够使用“更加易用”的XMM寄存器,而非“较难用”的x87寄存器堆栈。双精度浮点SSE2指令继续使用x87浮点执行单元。 

  

      含超线程(HT)技术的英特尔奔腾4处理器和英特尔至强处理器(例如90纳米Northwood和Prestonia)中增加了SSE3指令。SSE3指令只是增加了几个SSE或SSE2指令集中所没有的较为独特的指令,但并未增加任何重要的新功能。 

  

      而在英特尔全线台式机处理器酷睿、酷睿2处理器、移动平台上的迅驰®处理器以及服务器上全新的英特尔至强处理器上采用的酷睿架构中,英特尔在原有的 SSE3指令集的基础上新增了SSE优化,包括酷睿2处理器架构加速的SSE, SSE2和SSE3双操作(operations two-fold)。经过优化的架构可以在单时钟周期内执行一条128位SSE, SSE2或SSE3指令。 

  

      下一代SSE4指令集将集成在2007年下半年发布的下一代45nm产品中,其中包括代号Nehalem的英特尔第二代酷睿®架构。SSE4增加了50条性能增强指令。这些指令优化矢量编译、媒体、文本和字符串处理以及程序目标加速。 

  

      CPU 微体系结构对浮点运算的影响

      以下是双核英特尔至强5100处理器(Woodcrest)上其中一个内核的微体系结构图表。您将注意到FP-Mul/FP-Div 和FP-Add 单元(在图表中显示为 Fadd 和 Fmul/Fdiv)处于不同的输出端口(因此支持每时钟周期发出和撤销两条浮点运算)。

Woodcrest 处理器微体系结构

      为了与上述进行对比,下面列出了 AMD K8S 处理器微体系结构(单核):

AMD K8S处理器微体系结构

      下表是对AMD当前(K8S 双核)和下一代处理器(Deerhound 四核)的浮点运算能力的总结。列出四核英特尔至强5300处理器(Clovertown,双核)和双核英特尔至强5100处理器(Woodcrest,四核)的值作为参考。值得注意的是,当前Woodcrest的浮点运算能力大约是AMD Opteron的2倍。虽然将AMD在2007年第3季度推出“Deerhound”,但届时,Clovertown仍会因其较高的内核频率继续保持一定的领先优势。

 

最高持续浮点运算

 

AMD

英特尔

 

K8S

(双核)

Deerhound

(四核)

Woodcrest

(双核)

Clovertown

(四核)

单精度

22.4 GFLOPS

78.4 GFLOPS

48 GFLOPS

84 GFLOPS

双精度

11.2 GFLOPS

39.2 GFLOPS

24 GFLOPS

42 GFLOPS

扩展双精度

11.2 GFLOPS

19.6 GFLOPS

12 GFLOPS

21 GFLOPS

单插槽最高持续浮点运算(英特尔对比AMD)

      注: 

            1.K8S:4次单精度运算/指令×1条浮点指令/时钟×2个内核=8次浮点运算/时钟 

            (×2.8GHz=22.4GFLOPS) 

            2.K8S:2次双精度运算/指令×1条浮点指令/时钟×2个内核=4次浮点运算/时钟 

            (×2.8GHz=11.2GFLOPS) 

            3.K8S:1次扩展双精度运算/指令×2条浮点指令/时钟×2个内核=4次浮点运算/时钟 

            (×2.8GHz=11.2GFLOPS) 

            4.四核的值是英特尔和AMD都将时钟速率相对双核降低12.5%的预测结果。 

            (例如,英特尔为3.0×.875=2.625GHz;AMD为2.8×.875=2.45GHz)

      综述

  尽管所有的浮点运算都在一个执行单元内运行,但是不同的指令用于执行不同的运算精度。了解什么运算单元能运算什么指令会让你明白具体每个处理器理论上的浮点运算能力(FLOPS)意味着什么。

简单的计算一个处理器有多少浮点运算单元并不能准确的告诉你该处理器的浮点运算能力

你需要了解浮点运算单元的计算宽度,每个浮点运算单元能执行的指令,每个指令运算的精度以及在一个时钟指令内每个指令能执行的数量。

  

posted on 2011-09-01 14:42  Primitive  阅读(501)  评论(0编辑  收藏  举报

导航