技术新知:不同CPU架构如何影响浮点运算性能

      为了帮助广大网友更好的了解浮点运算,以及处理器结构与浮点运算之间的关系,我们服务器在线特别与英特尔公司合作发布了这篇文章,希望大家可以借此加深对浮点运算的相关知识了解。


      本文包括三大部分:第一部分:浮点Q&A。第二部分:浮点运算与英特尔。第三部分:SPECfp_rate_base2006 性能指标评测说明。


      如果您对本文介绍的信息感兴趣,或还有新的疑问及评论,都可以发邮件至:info@doit.com.cn 或者点击这里加入论坛讨论。前十位发送邮件的网友将会获得由英特尔公司提供的小礼品。


      第一部分:浮点运算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)意味着什么。简单的计算一个处理器有多少浮点运算单元并不能准确的告诉你该处理器的浮点运算能力。你需要了解浮点运算单元的计算宽度,每个浮点运算单元能执行的指令,每个指令运算的精度以及在一个时钟指令内每个指令能执行的数量。


 


      第二部分:浮点运算与英特尔



      对于计算机而言,计算复杂程度越大,要求的内存值也就越多,计算所用的时间也就越长,同时也需要更多的晶体管来支持计算。在上世纪九十年代前,这确实是一个难题,怎样能让计算机更轻松的处理越来越复杂的运算?直到一个人的出现,难题迎刃而解了,他就是浮点计算的先驱??威廉?凯亨(William M.Kahan)。


      计算机中的“数”有“定点数”和“浮点数”之分,“定点数”的运算部件的设计和实现比较容易,而“浮点数”的运算部件的设计和实现却复杂得多,并且困难得多。 因此,较早的计算机许多都不配备浮点运算,而是采用IBM的巴科斯(J.Backus,1999年度图灵奖获得者)发明的软件,由定点运算部件去完成浮点运算。可这种做法使浮点运算的速度大大降低,也就难以满足某些应用的需要了。


      就是在这种情况下,威廉?凯亨,这位1933年6月出生在多伦多,曾经供职于英特尔的人解决了这个问题。威廉?凯亨在完成中学学业以后,进入著名的多伦多大学。在那里,他实现了“三级跳”??继1954年取得数学学士学位以后,1956年和1958年又先后获得硕士学位和博士学位。学成以后,凯亨在母校和加州大学伯克利分校从事过教学和研究工作。在英特尔供职期间,凯亨主持设计与开发了8087芯片,成功地实现了高速、高效的浮点运算部件。直到目前,以80×86为CPU的计算机,若需完成科学与工程计算方面的课题,也必须同时配置8087这种数学协处理器。同时,一些著名的数学软件包,如Mathematica,也必须在配有8087数学协处理器的机器上才能运行。由于他的突出贡献,凯亨后来又受命主持制定了二进制的、与基数无关的浮点运算标准,即IEEE754标准和IEEE854标准。而这两个标准至今仍为绝大多数的计算机厂商所遵守。也正是由于这两个标准,ACM于1990年1月宣布凯亨因在浮点运算标准的制定上的贡献而获得图灵奖。


      严密、严谨、严格、追求更进一步是威廉?凯亨的一贯作风,也是他留给英特尔在不断研发新的计算机浮点运算技术道路上的一笔精神财富。英特尔与浮点运算有着不解之缘,不论是从创始还是到一路走来的发展,英特尔都在贡献着自己最大的力量,相信在明天,英特尔依然会伴随着浮点计算的不断发展继续前行。


 


      第三部分:SPECfp_rate_base2006 性能指标评测说明




      SPECfp_rate_base2006是一项计算密集型性能指标评测,用于衡量计算机系统在运行大量并行任务时的浮点吞吐性能。性能指标评测包括从实际最终用户应用开发而来的一组十四个浮点工作负载。通过将性能指标评测的拷贝数量设置成操作系统可识别的逻辑硬件内核数量而同时运行多个性能指标评测拷贝来测量系统吞吐率。报告的性能得分是按工作/小时测量的系统吞吐率的衡量标准。得分越高表示性能越好。


            SPECfp2006:当采用全面优化的编译程序进行编译时的17个标配比率的几何平均值。每一个比率代表一个浮点运算基准测试。 
            SPECfp_base2006:当基准测试采用最低优化的编译程序进行编译时的17个标配比率的几何平均值。 
            SPECfp_rate2006:当基准测试采用全面优化的编译程序进行编译时的17个标配吞吐率的几何平均值。 
            SPECfp_rate_base2006:当基准测试采用最低优化的编译程序进行编译时的17个标配吞吐率的几何平均值。


      如果您对本文介绍的信息感兴趣,或还有新的疑问及评论,都可以发邮件至:info@doit.com.cn 或者点击这里加入论坛讨论。前十位发送邮件的网友将会获得由英特尔公司提供的小礼品。