● GPU逐渐强化的双精度运算能力和存储子系统优势
从GTX200和HD 4870系列显卡开始,两大厂商都提供了对双精度运算的支持。HD 4870集成的大ALU依靠ALU.transcendental电路来执行双精度浮点数据的运算,ALU.transcendental主要的作用是为了指令补完,每个时钟周期内能执行一个双精度乘加运算。因为可以每个周期能执行160条MULADD指令也就是说HD 4870的峰值双精度运算能力是单精度运算能力的四分之一,也就是240GFLOPS。但是在通常情况下,HD 4870的双精度性能会被看作是1/4或者1/2,因为人们在编写通用程序的时候,可能很少使用到ALU.transcendental,这时候程序就会表现出1/4的单精度 MULMAD 指令吞吐率或者1/2的单精度ADD指令吞吐率。
GTX200核心的每一个SM都包括了一个双精度64Bit浮点运算单元,这个单元就是SFU(Special Function Unit,特殊功能单元)。这个处理单元可以用来辅助SP单元处理特殊的函数运算、插值属性的顶点+像素着色、执行浮点乘法运算指令(MUL)。GTX200芯片中的SFU单元已经不像G80时代的线程调度器,而是具备完整的线程发放能力,支持单周期一个乘加+一个连加运算。所以GT200的双精度运算性能衰减是单精度的1/8。这样GTX200就相当于一个30核心的双精度64Bit处理器。根据资料计算,GTX280峰值双精度64Bit浮点运算能力大概在90GFLOPS左右。
运算能力对比
目前困扰GPU厂商的一个主要问题还是周边资源特别是共享寄存空间的不足,因为双精度运算寄存器系统消耗最大,这里的寄存器即缓存,NVIDIA称之为Shared memory,AMD称之为LDS(Local Data Share)。这个共享寄存器位于每个流处理器单元内部的所有运算单元中,它在通用计算时负责共享数据和临时挂起线程。
共享寄存空间的提升需要半导体工艺的强大支持,因为这部分缓存和CPU一样使用6T SRAM晶体管,SRAM的每一个比特位需要占用6个晶体管,存储密度较低,1MB容量的二级缓存就需要占用5000万个晶体管,这是一个相当惊人的数字。目前在CPU的逻辑分布中,二级缓存占据的硅芯片面积甚至大于运算核心。在晶体管数量已经相当庞大的GPU(如GTX 280集成度多达14亿个晶体管)中,要集成大量的缓存更是难上加难。
容量足够大的共享缓存可以在运算时提高线程的挂起能力,这将直接提升GPU的分支运算能力。同样大容量的缓存在运算精度提升时可以确保更低的性能衰减,届时GPU将拥有更强的双精度能力,理论上会和其单精度运算能力一样远超CPU。这样的直接后果是让GPU更加适应混合精度环境,让通用计算走得更远。
如未来的DirectX 11强制要求每组流处理器拥有32k大小的共享寄存空间,正是为了加强GPU的双精度运算能力。又如2008年12月,另外一个重要的分布式项目SETI@home宣布正式利用CUDA平台支持显卡计算。SETI的重要研究方向,就是从天球背景中接收到的无线电中滤掉杂音。这种降噪运算必须依赖混合精度,而GPU支持这种运算的前提就是拥有稳定和强大的混合精度运算能力。
GPU运算相对于CPU还有一项巨大的优势,那就是其内存子系统,也就是显卡上的显存。当前桌面级顶级产品3通道DDR3-1333的峰值是32GB/S,实测中由于诸多因素带宽在20 GB/S上下浮动。HD 4870 512MB使用了带宽超高的GDDR5显存,内存总线数据传输率为3.6T/s或者说107GB/s的总线带宽。GTX280使用了高频率GDDR3显存,但是其显存控制器支持的位宽达到了512bit,搭载16颗0.8ns GDDR3显存,带宽高达惊人的142GB/s。而主流GPU普遍拥有40-60 GB/s显存带宽。存储器的超高带宽让巨大的浮点运算能力得以稳定吞吐,也为数据密集型任务的高效运行提供了保障。
目前GPU已经是足够强大的可编程处理器,非常适合大运算量的科学应用,诸如地质勘探,生物学,流体力学,金融建模等等。这使得GPU应用于地球科学、分子生物学和医学诊断领域的高性能计算为实现重大的发现提供了可能,这些发现会改变数十亿人的生活。