NVIDIA夺面双雄 GT200全球同步首测
1995年5月,NVIDIA第一代产品NV1推出。 1999年8月,世界上第一款GPU—GeForce 256诞生。
2002年11月,NVIDIA首款DiretX 9芯片NV30推出。
2004年4月,NVIDIA第一款DiretX 9.0C芯片面世。
2006年11月,世界上首款支持DirectX 10新品G80与世人见面。
2008年6月16日北京时间晚9点,NVIDIA最新GT200横空出世……
……
G80开创了一个属于NVIDIA的DX10显卡时代。经过两年多的积淀,NVIDIA在今天正式全球发布了第二代统一计算架构的图形产品GT200,这是在Geforce 8/9系列基础上的又一次革新性的统一架构设计,它的发布宣告了一个CUDA桌面应用的时代正式到来,本文就将带着各位读者一起来解析这款2008年最重量级的GPU产品! 文章:孤竹の子、zZ、宁道奇、Metal、烈火
评测:zZ 第一部分:开篇 第二部分:CUDA架构与视觉计算的方向 CUDA的概念及API实现方式
并行处理器与CPU的设计上的差异
第三部分:GT200并行计算架构 共享缓存机制
STMT架构 CUDA加速应用实例
分布式计算:Folding@home
视频转码
PhysX物理运算 第四部分:GT200图形计算架构 图形计算架构
Medusa Tech Demo解析
几何着色器与流处理器
寄存器数量翻倍
像素纹理比例改良
ROP单元改良
显存位宽升级512bit
加入动态功耗管理 第五部分:GTX280图形架构及硬件产品介绍 GTX280/260规格差异
GTX280 P651版型介绍
GT200核心面积高达546mm2
显存、供电部分
外置NVIO芯片
巨型双槽散热器 首发厂商:XFX GTX 280
首发厂商:耕昇GTX 280/260 第六部分:测试平台介绍 第七部分:GT200性能测试 GPU视频转码测试 3Dmark Vantage
LightMark 2007 孤岛危机
刺客信条
虚幻竞技场3
生化奇兵
战争机器
失落星球:极限状态
狂野西部
鱼雷艇:海上骑士
冲突世界
雷神战争 功耗对比测试 第七部分:后话 测试总结
编辑点评GTX 280 无可否认,G80确实是一颗优秀的显示芯片,无论是其革命性的DirectX 10架构,还是其至今处于顶峰的旗舰性能,亦或是其衍生产品的高清解码能力,都促成了G80的经典地位。但是,在G80发布之后的两年中,我们似乎看到的是整个GPU行业不前,G92与G80同根同源,只能看作是G80核心的改良版本,性能提升根本无法达到我们的预期,而在性能上,G80核心的GeForce 8800Ultra至今仍旧是单核心显卡中性能的王者。G80虽然优秀,但是是否优秀到可以让这个被誉为超越”摩尔定律“的行业就此停滞不前?
就像很多人抱怨一样,G80之后显卡界没有一款值得兴奋的产品,有人将这归结于AMD-ATI产品性能不济,没有竞争自然就没有发展,失去对手的NVIDIA自然也就放慢GPU的研发速度,然而事实却并不是有些人想象的那样……
如果经常关注IT的发展动向,你会发现NVIDIA这个名字除了经常与AMD-ATI出现在一起之外,更多的时候则是与Intel联系在一起,本来作为合作伙伴这也无可厚非,但是我看到更多的则是针锋相对。也许在两年前,GPU还甘心做PC中仅次于CPU的第二大处理芯片,但是随着显卡所能实现的功能越来越多,GPU正在向PC中第一重要芯片的方向努力,GPU的作用越来越明显,甚至将主导PC的发展。GPU的不断壮大自然会威胁到CPU,那么战场自然就转移到Intel与NVIDIA——两个领域中王者之间。
2007年初,Intel宣布回归独立显卡领域,预计在2009年出样“Larrabee”,同时进一步强调CPU才是PC的主导;而NVIDIA则继续的改变消费者对传统PC构架的认识,使消费者认同GPU的作用大于CPU,另一方面也全面部署GPU的通用计算的研发工作。而今天我们终于迎来了时隔两年之后的NVIDIA革命性产品——GT200。
| 8800GTX | GTX 280 | 提升幅度 | Cores | 128 | 240 | 87.5% | TEX | 64t/clk | 80t/clk | 25% | Rop Blend | 12p/clk | 32p/clk | 167% | Precision | FP32 | FP64 | -- | GFLOPs | 518 | 933 | 80% | FB Bandwidth | 86 GB/s | 142GB/s | 65% | Texture Fill | 37GT/s | 48GT/s | 29.7% | ROP Blend
| 7GBL/s | 19GBL/s | 171% | PCI Express | 6.4GB | 12.8GB | 100% | PureVideo | VP1 | VP2 | -- | GT200是在没有对手可以超越的情况下诞生的,NVIDIA给G80的下一代旗舰产品定下的设计目标是:超越上代G80性能50%以上,在2560x1600极限高清分辨率下保证动态3D即时渲染、同时满足高性能虚拟计算和专业计算的需求。因此我们看到的GTX 200系列GPU,核心内部拥有更多的处理核心数量和管线规模。同时在G80一代基础上,GT200在很多细节方面做出了改进,诸如纹理处理、几何单元、Dual issue,Stream out流输出,全面提升核心线程的执行效率和并行处理能力。
GT200有两种不同的应用架构,一个是并行计算架构,另一个是图形计算架构,为什么会设计两种架构呢?让我们追根溯源,从GPU的发展谈起:
显卡最初的作用是在CPU的控制下,将主机送来的显示数据转换为视频和同步信号送给显示器,最后再由显示器输出各种各样的图像。早期的显卡并不能承担所有图像处理的工作,它只是起到了一种“桥梁”的作用。 显卡可以对CPU发送过来的数字信号进行转换,使它成为显示器所能够识别的模拟信号。
随着技术的进步,特别是图形操作系统的出现,人们便在显卡上集成一个可以快速处理图像数据的图形图像处理芯片, 于是这图形处理的重担便落到了显卡的身上,让显卡专门负责图形处理任务,这样CPU的任务就大大减轻了,如此分工合作,也大大提高了计算机的整体性能。 2D图形加速卡是早期显卡的一种简称,因为那时显卡只具备处理2D图形的能力。当电脑要要处理3D图形时,其数据计算和处理仍须由CPU完成。

IBM 电脑5150集成第一块显卡 1981年,IBM推出个人电脑时顺便推出了单色显卡和彩色绘图卡两种显卡,主要进行文数字和图形方面的数据处理。在经历了漫长的2D时代发展之后,Matrox在1993年推出了历史上第一款准3D显卡Millenium?I,2001年微软发布的DirectX 8正式摒弃T&L(坐标转换和光源),以“Shader(着色器)”概念引起显卡界的革命后,DirectX 9.0/B/C粉墨登场,DirectX 10 API发布之后,G80携统一流处理单元架构面试,彻底终结了Pixel Shader和Vertex Shader的时代。
在GeForce4 MX 时代NVIDIA就加入了硬件解码MPEG-II的功能,从而实现了播放DVD时较低的CPU占用率,后来随着PureVideo技术的推出,在高清电影方面也实现了GPU的硬件加速,G80之后,NVIDIA还加入对Google Earth、图片预览、Adobe Reade预览等等软件加速功能。
从最初的桥梁作用,到之后无论是图像数据处理,还是2D、3D游戏的加速,其实显卡一直都是在做着解放CPU的工作,也许有些人认为显卡就是为游戏而生,然而实际上,这个最重要的功能也是从CPU手中夺得的,只是经过近20多年的发展,人们已经习惯于把游戏功能和显卡划等号。
GPGPU和CUDA实现上的差别
如果只是显卡从游戏手中夺得了游戏功能也就算了,最近几年的高清视之战也是GPU从CPU手中夺取本来该由CPU处理的工作,而近几年随着通用计算处理器GPGPU(General-Purpose computing on Graphics Processing Units)的提出,在科学和专业领域、医学等领域以颇有建树,CPU的地位更是进一步被GPU所蚕食,民用领域中,实际上我们所说的高清硬件解码也是GPGPU计算的一个初级形态。
大家也都知道,目前针对GPU实现通用并行计算的CUDA解决方案与GPGPU两者实现有何区别呢?这里笔者陈述一下自己的理解。 GPGPU和CUDA实现最的差异就在对GPU通用计算的理解层次不同。GPGPU仍旧把GPU当作一块显卡,它使用DirectX和OpenGL这样的图形API实现计算目的,正因为如此,它需要编程人员了解图形AIP和硬件的细节。这样编程模型也限制了随机读取显存和线程协调方式。而CUDA的通用并行计算实现则更彻底,打破了图形API的限制,编程人员不会感觉到和以往在CPU编程的区别。
比如在图形API中,API框架限制了在预先制定好的内存单元输出32位浮点(渲染目标格式是RGBA*8),这限制了很多新的算法不适合使用图形API来实现。图形API强制用户把数据存储为纹理格式,它需要把长数组打包为2D纹理格式。这对于通用计算不但繁琐,而且必须加入额外的寻址算法,这都会增加额外的开销。
与此相对应,CUDA使用C的一个扩展来进行并行计算,它允许编程人员使用C编程,不需要把问题转化为图形处理元素来处理,任何能用C编程的程序员能够理所当然的掌握CUDA编程。CUDA对地址单元和存储数量没有任何限制,同时也支持数据存储为标准数组形式,同时能够对任意显存地址进行访问。
由于GPGPU开发程序需要程序员详细了解专业的图形语言等,因此一直都无法大规模普及,而解决这一问题的关键就是NVIDIA的CUDA。
关于CUDA:
CUDA是NVIDIA针对GPU的C语言开发环境开发的通用计算平台标准,全称是Compute Unified Device Architecture统一计算设备架构。CUDA可以充分应用GeForce 8/9系列 GPU 流处理单元的浮点运算能力,解决复杂的科学运算问题,诸如地质勘探,生物学,流体力学,金融建模等等。根据NVIDIA的测试,8800显卡在CUDA架构中的峰值运算能力可达520GFlops,因此如果构建SLI双卡系统,可以达到1TFlops(即每秒运算1万亿次)的强大运算能力。
在了解了通用计算架构的概念和开发语言环境后,我们下面来具体谈一谈CUDA的运行方式:CUDA包含3个主要的组件,可以高效执行并行程序的GPU,一个可访问GPU上并行计算资源的编译器,以及一个计算专用的CUDA驱动。 CUDA的执行过程,首先要分析现有的程序或者算法哪些代码段存在瓶颈,并且适合做并行执行。接着,这些函数将重定向到GPU,用CUDA的扩展C去重新定义并行数据结构和操作。程序被NVIDIA的CUDA编译器重新编译,产生供CPU和GPU共同执行的代码。当程序执行时,CPU自行代码的串行部分,而GPU则执行包含大量计算的CUDA代码。GPU执行的代码部分也可以被称为“kernel”部分,它定义了加载在数据组上的若干操作。
GPU收到“kernel”代码后,对数据组中的每一个元素创建一个实例,这些kernel实例就被称为线程。一个线程包含它自己的程序计数器,寄存器和状态。对于一个大型的数据组,比如图片或者数据处理,会产生上百万的个线程。
线程在GPU中是以32个为一个“warps”组的形式执行的。Waps被线程调度部分分配到流处理器组SM中执行。一个SM包含8个处理器核心,每一个核心称为流处理器单元SP,或线程处理器,具备每线程一个指令的执行能力。因此,执行完毕一个32线程的Warp,SM单元需要4个处理时钟周期。
不过我们要认识到,SM本身也是高度多线程化设计的,支持同时执行32warps。在每一个时钟内,硬件接收、选取哪一个warp执行,从一个warp切换到下一个之间不会有任何性能上的损耗。我们再来看看CPU宣称的同时执行32个程序并且无损切换运行环境的真实情况,实际上大多数CPU核心同时支持一个程序段,当程序进行进场或者退场切换时,往往会产生上百的时钟延迟。
举个最简单的例子,我们手头有个最简单不过的计算,两个包含1000个元素的数组相加。如果是CPU做这件事情,顺其自然是进行不断的循环操作,把两个数组中的对应元素相加产生新的数组元素,对于本例来说,必须进行1000次循环操作。而GPU如何执行这个操作呢,GPU定义一个数组的加操作,并且为数组中的每一个数据元素生成一个加法的程序的实例,对于上面的1000个元素的数组也就需要发布1000个加法线程。对于今天拥有240个内核的主角GTX280来说,只要5个时钟周期就可以完成。
通说上述的分析,我们不难看出CUDA的本质思想,CUDA程序定义了一个程序的并行关系,然后GPU接收到这些信息后硬件发布线程。而编程者就能从繁琐的线程的创建、管理和撤出设计中解放出来。同时CUDA还允许程序编译一次后在拥有不同核心数量的GPU上执行。
2007年2月,NVIDIA就发布了CUDA软件开发包及C语言编译器的0.8版本,G80系列GPU可以完整的支援CUDA架构,不过其问世后仍旧只针对非常适合大运算量的科学应用,诸如地质勘探,生物学,流体力学,金融建模等专业领域,离民用级运算还有一段路要走。CUDA1.1版本之后,桌面级显卡驱动中也集成了CUDA驱动,GeForce 8/9系列显卡均可支持CUDA软件。
CUDA的出现,使得GPU变得不再是一块简单的3D图形处理器,这种全新架构的计算方式,威胁的最大对手将会是X86架构!
2008年6月8日是X86诞生的30周年,在PC领域“X86无处不在”,30年沉淀庞大的软件群支持几乎使X86不可能被超越,这其中也包括Intel自己,历时10余年耗资巨大安腾IA-64架构的建树也远无法与X86架构相提并论,几年前辈炒得火热的X86-64技术也只是X86架构的升级版本。 CUDA架构又是凭什么抗衡似乎无所不能X86架构?这就与前文NVIDIA所提出的在PC中GPU作用大于CPU谈起,因为所谓的CUDA架构对抗X86架构,实际就是GPU与CPU作用与功能之间的对决,下面我们来来看一下GPU与CPU设计方向上的差异。 随着GPU设计完全可编程化后,“GPU通用计算”的概念开始浮出水面,读者在理解这一技术为我们未来电脑使用带来的巨大变革之前,我们先来看看GPU和CPU设计的思路的天然差别——GPU的设计更注重运算能力和吞吐能力,而CPU关注的重点则在减少延迟使它的流水线时刻处在忙碌状态(提高缓存的命中率和分支预测准确度),最终CPU和GPU实现产品硅片上不同功能晶体管所占面积的比重就很能说明问题,CPU把80%的晶体管用来实现片上缓存,20%用来实现真正的运算部分;而GPU用在计算上的晶体管数量占到全部的80%。随着GPU通用计算概念的诞生,自身设计也在进行一定的调整。我们可以将两者的主要区别归纳一下:
设计目标:
CPU:设计是尽可能快的执行一串指令,
GPU:的设计则是尽快执行多并行的代码串;
晶体管占用量:
CPU:住要的晶体管用在指令排序缓存、保留栈、分支预测等硬件实现,还有大容量on-die缓存。这些设计都是为了加速执行单线程的能力。
GPU:晶体管主要都投放在处理器阵列、多线程硬件、共享缓存以及多内存控制器上,这些设计不是专门为提升一个特别线程的速度,而是使得整个GPU能够支持数万线程同时运行,促进线程间的通讯,以及持续的高显存带宽。
Cache的作用:
CPU的cache设计通过减少访存延迟来提高性能。而GPU使用cache(或者软件管理的共享存储器)来增强带宽性能。
如何控制延迟:
CPU通过更大的cache和硬件分支预测来控制访存延迟。这一方面会占用大量的die面积,同时也是能耗大户。GPU通过一次载入上千线程来控制延迟,如果哪一个线程需要等待从显存载入数据,GPU马上无延迟的切换到另一个线程替换。
多线程能力:
到目前为止,我们能买到的桌面CPU每个核心的最多支持2个线程,CUDA支持下的GPU每个SM能够同时支持1024的线程。两者在切换线程时的时钟消耗差异巨大,CPU通常有数百个时钟,而GPU一般只需几个线程,几乎达到无损。
SIMD VS SIMT:
CPU使用SIMD(单指令多数据)单元进行矢量计算。GPU使用SIMT(单指令多线程)进行标量线程运算。SIMT不需要编程人员把数据重组成矢量形式,而且允许线程的任意分支行为。
内存控制:
现在CPU和GPU之间的访存吞吐也存在巨大差异,CPU一般使用 64bit内存控制器,或是分离到北桥或是集成,而CUDA支持的GPU最多支持GPU的八个内存控制器,实现带宽是CPU的10倍!
那么GPU和CPU各自设计特点决定自身的应用优势又在哪里呢?CPU的设计构架更擅长有分支和随机访存的串行计算,GPU则在大规模并行的浮点运算中有优势突出。如此说来可能还是有些抽象,因为现实世界的软件也从来不会按照简单的串并行来区分这些,实际上,也几乎没有软件能纯粹地划归为串行或者并行实现的。绝大多数软件会根据所需混合使用串并行运算。真要把我们平常使用的软件归归类,那么像编译器、字处理软件、Web浏览器,email客户端可以看作典型的串行实现的软件;而像视频回放、视频编码、图片处理、科学计算、物理模拟以及3D图形处理(无论是光线跟踪还是现在主流的光栅化处理)都是典型的并行应用。 可以说,NVIDIA在开发GT200时更多的考虑是如何将其并行计算能力发挥到极致,下面以Geforce GTX 280为例来分析一下GT200的并行计算架构(Parallel Computing Arthitecture)。GT200庞大的核心Shader阵列和新增的功能单元,更多是出于提升并行计算的能力和效率而设计的。
GT200并行计算模型包括一个庞大的TPC线程阵列,共有10组,每组TPC阵列拥有一个基于硬件的线程管理器(thread Scheduler)、材质纹理缓存(Texture caches)、L2纹理缓存、显存界面单元(Memory Interface units),纹理缓存通过“Atomic”单元来自动调整和控制对显存的读写访问操作。控制Combine内存访问,为实现更高效和更高带宽的内存读写操作。“”Atomic单元的功能是提供内存定址和减少并行,和并行数据结构管理。
和传统CPU当中片上缓存占据大部分芯片面积不同,GeForce GTX 200 GPU当中,大部分芯片面积都用来进行图形和计算处理。粗略的统计显示,CPU芯片当中只有20%的晶体管专门用来进行逻辑计算,而GPU芯片当中有80%的晶体管都用来进行逻辑计算。 每个SM单元共享16k缓存
GT200内部的每个TPC均集成3个TPA,NVIDIA在每个TPA均加入了16KB本地共享缓存。TPA单元中的线程处理核心不仅可以与同TPA中的其他处理器交换数据,与其他TPA单元中的线程处理也可以通过共享内存交换数据,不需进行读取、写入操作,也不用占用外部LI缓存,完全做到数据共享,这种架构设计会大大提升线程并行的效率,加速计算的速度,并且对各种类型的计算都有显著的加速效果,其实这种设计也是在将计算延迟降到最低。
一个TPC单元,在每三个SM模块阵列中拥有16k片上共享缓存,位于SM中的每个流处理核心与其它核心共享数据,而不需要去访问外部的显存部分。
线程处理器中包含3个部分,运算单元(包括浮点与整数运算)、寄存器,运算单元负责数据的浮点、整数及二进制位(bit)内存操作、,逻辑操作运算,寄存器组则相当于缓存的功能,负责数据的存储。 通过240个线程计算器与1300MHz的线程处理器频率,GeForce GTX 280可提供933 gigaflops的浮点运算能力,比G80的浮点能力翻了一番,对比目前顶级的酷睿2处理器则可以提供的30~50 gigaflops能力,高出了几十倍。另外我们需要注意的是,之前在比较GPU与CPU处理能力的时候总是忽略的整数性能的比较,这是因为之前用于GPU与CPU不同的程序,而如果GPU要真正通过CUDA架构涉及桌面级的主流程序运算,整数能力也就变得至关重要,因为3D以为的程序通常考验的是处理器的整数能力。不过无须担心,因为GeForce GTX 280的整数能力同样是目前顶级CPU的几十倍。 除了线程数提升到G80的2.5倍以外,SIMT(Single instruction-multiple thread)单指令多线程架构的引入,也保证了GeForce GTX 280的每个线程处理器可以全负荷工作。 GeForce GTX 280的TPC线程阵列使用的是MIMD多指令多数据的处理方式,而具体到TPA则是采用了SIMT。MIMD比SIMD(单指令多数据)更进一步强调了晶体管的执行效率,但是缺点是更加难控制,解决好了指令和数据的控制问题,MIMD就能真正的发挥威力,那么MIMD就是最高效和理想状态的体系结构。 而关于GeForce GTX 280能否解决好指令和数据控制问题我们根本就不需要担心,因为在G80时期NVIDIA的线程管理器设计功底就已经有目共睹,G80可以128个SP完胜R600的320PSU,线程管理器GigaThread就功不可没。 而在TPA中采用SIMT架构则更加完善GPU的整体执行效率。SIMT是由SIMD单指令多数据的处理方式中改进而来的,这种设计既能保证处理的效能,同时又兼顾了硬件的可编程性。 SIMT使用的是标量指令,这点与G80相同,不必再设置矢量指令的宽度,因此它们可以全速处理固定长度的矢量指令。相反的如果输入的指令长度更小,那么SIMT处理的速度也要比MIMD和SIMD要慢。因此SIMT可以确保每一个处理核心总是能够全负荷工作。从程序员的视角来看,SIMT也可以为每一个线程设定自己独立的处理路径,在对矢量指令的管理中,硬件可以自动进行分支,而不必分支管理器进行干预。 可执行多达3w的线程数量
其实单纯的比较这些浮点与整数的运算数值并没有太多意义,举个简单的例子,如果只论浮点预算能力,G80是无法与R600与RV770相比较的,但是我们知道G80核心的GeForce 8800 GTX所能提供的运算能力越是R600及RV770所无法企及的,这是因为NVIDIA在设计产品的时候不仅考虑到ALU的理论浮点运算能力(Flops),ALU的运算效率也同样是NVIDIA关注的重点。 从前文的GeForce GTX 280线程处理器分析中我们可以发现,GeForce GTX 280更像是一颗传统CPU的核心设计,整数和浮点运算,内存操作运算,逻辑操作等设计,GeForce GTX 280的每一个线程处理器是一个带有多重管线阶层的硬件级多线程处理器,硬件级别的线程调度确保所有的处理核心都100%满负荷运转。如果比较特殊的线程在等待访问显存,那么GeForce GTX 280的硬件级别的调度控制就可以马上顺序切换到后面的线程,让其他线程可以对显存进行不间断的访问,从而实现零等待的高效显存访问机制。 Chip | TPCs | SM per TPC | Thread per SM | Total Threads per Chip | Geforce 8/9 | 8 | 2 | 768 | 12.288 | Geforce GTX 200 | 10 | 3 | 1024 | 30.720 | 在TPA中的多重指令处理单元可以同时创建、管理、调度和执行32组并行的指令,在GPU中是以32个为一个“warps”组的形式执行的。Waps被线程调度部分分配到流处理器组SM中执行。一个SM包含8个处理器核心,每一个核心成为流处理器单元SP,或线程处理器,具备每线程一个指令的执行能力。因此,执行完毕一个32线程的Warp,SM单元需要4个处理时钟周期。
GeForce GTX 280具备32 Warps/SM的处理能力,而上代GeForce 8、9中仅仅具备24 Warps/SM的处理能力。G80可以处理的线程数是12,288个,GeForce GTX 280拥有10组TPC单元,每个TPC单元具备3个TPA单元,而每个TPA中可以运行1024个线程,那么GeForce GTX 280的最大线程数量可以达到30720个(1024线程/TPA x 3TPA/TPC x 10T PCs=30720)。
双精度支持 其实双精度浮点运算在民用领域涉及的并不多,主要集中在科学计算等领域应用,不过既然GeForce GTX 200作为并行架构处理器出现,那么支持双精度运算也就无可厚非了。 GeForce GTX 200 GPU架构当中,TPA核心内建一个双精度64bit浮点算术单元,达成全部30个双精度64bit处理核心。GeForce GTX 200中的专用流处理核心可以得到全速的双精度乘法运算(MAD),并且乘法运算使用线程处理器中的MAD单元,每个线程处理器可以进行三个浮点运算,将原始的顶点单元属性值,进行像素属性值的转换。
每个双精度单元可以执行1个fused累加,这种累加是1个双精度MAD指令,它完全遵循IEEE754R浮点标准。GeForce GTX 200 GPU当中全部10个TPC的双精度整体效能等于8核心Xeon CPU的效能,大约90gigaflops,而GeForce GTX 200的能够提供近乎1 Teraflop的单精度IEEE 754标准浮点运算能力。
基于CUDA的商业计算离普通消费者似乎远了一些,在这次GT200首发之日,NVIDIA给我们带来了一个GPU通过CUDA实现分布式计算的应用实例。 分布式计算是这几年来兴起的一门计算机科学,网格计算、云计算等概念都与其有类似的地方。它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,利用互联网上的计算机的 CPU的闲置处理能力来解决大型计算问题的一种计算科学。 Folding@home是一个研究研究蛋白质折叠,误折,聚合及由此引起的相关疾病的分布式计算工程。使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引近期对由折叠引起的疾病的一系列研究。 Folding@home目前进行中的研究:
●亨廷顿病
●成骨不全症
●帕金森氏症
●核糖体与抗生素
●癌症
自2000年10月1日起,在世界范围内已经有超过一百万颗CPU参与了本项目!感兴趣的朋友可以去http://www.equn.com/folding/去看看。Folding@home支持多种处理器和平台运算,包括CPU,GPU及PS3,在GPU支持方面可以支持所有的ATI显卡运行,此前并没有支持NVIDIA的GPU运算。随着Forceware 177.34驱动发布,NVIDIA也给我们带来了Folding@home CUDA客户端,能支持GT200以及Gefroce 8/9系列GPU进行分布式计算。NVIDIA测试数据得到GeForce GTX 280 运算初速为500 mol/day,而HD3870只有170mol/day,PS3速度为100mol/day,而CPU仅仅为4mol/day,GT200的速度分别是RV670的3倍和PS3的5倍,是CPU的160多倍。 Folding@home小组领导、斯坦福大学助理教授Vijay Pande称,即使全球NVIDIA CUDA显卡用户中只有1%参与到这一项目中来,也能让Folding@home迅速成为全球最强大的高性能计算系统,处理能力可达60-80PFLops。 使用过Premiere、After Effect等软件的用户都知道,视频编、转码其实是一个非常耗时间的过程,而目前的绝大多数的软件还是依赖于CPU,进行编码、转码计算时不仅需要占用大量的时间,而且对整个PC的资源也占用非常之大,如同在没有PureVideo HD之前我们观看高清电影一样,在转码期间我们几乎无法再对电脑进行任何的其他程序操作。
BadaBOOM Media Converter是Elemental Technologies公司联合NVIDIA开发的一款基于CUDA平台的转码软件,这个软件可以将MPEG/MPEG-II格式的影片转换成H.264编码VOB格式,在Apple风靡全球的的Iphone/Ipod等便携式设备播放。

实时转码的速度起码要达到每秒24fps以上 一个时长2小时的高清片源,在BadaBOOM Media Converter上采用GeForce GTX 280进行视频编码仅需要35分钟,达到了Super Real-Time(超实时转码)的速度,要比目前顶级的4核处理器快18倍。同时我们还可以使用电脑处理其他任务,在这转码完成的这段时间,将不再是无任何意义的枯燥等待! 目前我们的测试版本还只能支持到GT200系列,6月17日,也就是CUDA 2.0版正式发布的时候,BadaBOOM Media Converter正式版也会实时推出,同时也会加入对GeForce 8/9系列GPU的支持! 在即将发布的CUDA 2.0另外一个应用是PhysX物理加速,为抗衡Intel早前并购物理加速引擎开发公司Havok所得的技术 ,NVIDIA今年收购了物理加速卡厂商AGEIA,取得其 PhysX物理加速技术。经过数月开发后,NVIDIA已经完成了新版PhysX软件开发,使用GPU作为运算核心,并将在6月17日发布。
独立PhyX PPU已经成为历史 在收购AGEIA之后,NVIDIA宣布PhysX物理加速芯片将不再继续开发,取而代之的是建立在CUDA 2.0的新版PhysX驱动,GeForce 8/9,以及现在的GeForce GTX 200都将支持PhysX物理加速能力,其性能将达到单纯使用处理器加速的十几倍。 所有目前已使用PhysX技术的游戏都支持新版驱动程序,如果装有支持CUDA平台的显卡,游戏将自动选取显卡进行物理加速运算,否则仍会使用性能较慢的CPU进行运算。此外,PhysX并不只使用于游戏市场,同时亦会运用 CUDA通用运算领域上,应用更广。 游戏中实现物理加速绝非易事,它是一种对计算性能要求极高的环境,以一整套独特的物理学算法集为基础,需要同时运行大量的数学和逻辑运算。由于游戏物理学具有高度并行和互动的特性,因此GPU架构自然比CPU更加适合这种计算工作,物理运算需要十分强大的整数及浮点运算能力,而这正是GPU的强项,前文已经分析过,目前GPU的浮点及整数能力均是CPU的几十倍。 NVIDIA PhysX是一种功能强大的物理加速引擎,可在顶级PC和游戏中实现实时的物理学计算。PhysX软件被广泛应用于150多个游戏中,开发人员超越25000人,软件注册用户数量已超过10,000名。索尼的Playstation 3、微软的Xbox 360、任天堂的Wii以及个人计算机均支持PhysX,PC中支持多核CPU,GPU,PPU,并且是唯一CPU和CPU+GPU物理解决方案。
此外,PhysX设计用途是利用具备数百个内核的强大处理器来进行硬件加速。加上GPU超强的并行处理能力,PhysX将使物理加速处理能力呈指数倍增长并将游戏体验提升至一个全新的水平,在游戏中呈现丰富多彩、身临其境的物理学游戏环境。其中特色如下:
- 爆炸引起的烟尘和随之产生的碎片
- 复杂、连贯的几何学计算使人物的动作和互动更加逼真
- 其视觉效果令人叹为观止的全新武器
- 布纹的编织和撕裂效果非常自然
- 运动物体周围烟雾翻腾
目前采用NVIDIA PhysX的开发者数量正在呈几何式增长,在通过CUDA实现GeForce运行PhysX的第一个月中,超过12个AAA级游戏开发商签约采用GeForce PhysX,这比AGEIA在两年内签约的项目还要多,因为物理+图形计算一体化解决方案更受开发者的钟爱。
| PhysX | 其它 | CPU | Yes | Yes | PC加速 | Yes | No | XBox360 | Yes | Yes | PS3 | Yes | Yes | Wii | Yes | Yes | 到现在为止,已经有超过150款游戏采用PhysX物理引擎,包括我们熟知的虚幻竞技场3,即将发布的支持Geforce PhysX的游戏;《Backbreaker》By Natural Motion,《Bionic Commando》by GRIN,《Borderlands》by Gearbox Software,《Shadow Harvest》by Black Lion,《Space Siegek》by GPG,《Mirrors Edge》by DICE,《MStar》by Nurien,《APB》By Realtime Worlds。
在合适的机会收购AGEIA,将本质上等同于多线程的密集运算的物理加速技术整合到CUDA 2.0中,可以看出NVIDIA的远见卓识,物理运算最终是要为3D游戏而服务的,下页开始进入GT200的图形架构分析。
GT200图形计算架构模型 GeForce GTX 280的最小运算单元为Thread Processor(线程处理器),在图形运算中就是标量流处理器,8个线程处理器组成线程处理阵列(Thread Processor Array, 简称TPA),而3个TPA则组成了一个Thread Processor Cluster(现成处理阵列,简称TPC),因此在GeForce GTX 280中共有240个线程处理器,30个TPA及10组TPC。 GT200图形架构与并行架构的区别: 与前面GT200并行计算架构模型对比,你会发现,图形渲染架构多了几何Shader、ROPs单元这个单元模块,而少了“Atomic”SM控制单元。NVIDIA亚太区市场经理邓培植先生在讲解图形处理器与Tesla处理器的差别时,也特别提到这一点,因为并行计算需要的是GPU核心强大的多线程处理器浮点运算能力,不需要ROPs光栅输出这个步骤,因此在模型图里少了这一块功能单元。 从这个意义上去理解的话,GT200可以看作是Tesla和Geforce GPU的复合体,546mm2的Die Size面积,14亿个晶体管数量对于“一芯双面”的GT200也就不出奇了。 为了配合展示GeForce GTX 200的强大性能,NVIDIA特别了制作一个名为“Medusa”的Tech demo。在以往NVIDIA的DEMO通常都是一个人物,而在“Medusa” DEMO不但主要人物增多,而且更加重视庞大场景的描绘。
Adrianne demo 与Adrianne demo相比较,美杜莎demo场景平均每帧需要超过3百万个三角形生成。游戏中的人物之一勇士身体变成石头的过程运用了Geometry Shader特性,多大120个Render Passes多重渲染数据通过“Stream out直接从显存中调用数据,输回给像素或缓冲区,从而快速生成人物的皮肤、头发等。 [size=-1]小熊在线www.beareyes.com.cn
Adrianne demo 美杜莎摆动的头发加入了NVIDIA自家的PhysX物理特效,使得Demo摆脱了上代Adrianne demo的照片级静态真实感(Photorealism),达到动态真实的效果Dynamic Realism。 人物皮肤采用了“纹理空间光照”特效,10个分解的高斯模糊(gaussian blur)的后处理特效。DEMO场景地面采用了soft Shadows软边阴影和视觉闭塞映射(occlusion)特效。DirectX 纹理缓存应用于人物的面部表情变化基于GPU硬件动态生成的化石(petrification)及变形、火光和烟雾。 支持10-bit色彩输出 
Far Cry 2 - 极度高清动态美景(育碧) GeForce GTX 200效能高出前代GPU 50-100%,可以以更高游戏帧数和Extreme HD分辨率下运行特效全开的游戏,获得真正的电影级游戏体验。 GeForce GTX 200支持新的DisplayPort输出,允许超过2560x1600的分辨率,支持10-bit色彩,达成全屏超过10亿种不同的色彩(需要驱动程序,显示器和应用程序支持)。 这里需要注意的是前代G80也内建内部10bit色彩处理,但是只能支持8bit复合色彩输出(RGB)。GeForce GTX 200 GPU允许10-bit内部处理和10-bit色彩输出。 关于Gorgon Medusa(戈耳工 美杜莎)
戈耳工是希腊神话中的蛇发女妖三姐妹,居住在遥远的西方,是海神福耳库斯的女儿。高更(Gorgon)妖女族的族人,而高更族人都有用眼睛将人变石头的能力。因吹嘘自己比雅典娜长得漂亮而被这位智慧女神夺去了她的所有美丽,并且将头发变成毒蛇,成为一头面目狰狞的怪物。她们的头上和脖子上布满鳞甲,头发是一条条蠕动的毒蛇,长着野猪的獠牙,还有一双铁手和金翅膀,任何看到她们的人都会立即变成石头。
前面的Medusa DEMO NVIDIA特别强调了高效的几何着色和流输出在未来游戏中的作用,而GT200在几何着色器和流输出方面比上代G80也做出了很大改进。
这里跟大家回顾一下几何着色器(Geometry Shader)和流输出。在DirectX 10之前,几何体必须在写入显存之前被光栅化并送入像素着色器(pixel shader)。几何着色器是Shader Model 4.0中最新引入的功能单元,第一次允许程序在图像处理器中创建新数据。GPU在系统中本来只可处理已有数据,而有了何着色器之后,GPU不但可以处理数据同时又可生成数据。
DirectX 10引入了一个叫做数据流输出(Stream Output),它允许数据从顶点着色器或几何着色器中直接被传入帧缓冲内存(Frame Buffer Memory)。这种输出可以被传回渲染流水线重新处理。当几何着色器与数据流输出结合使用时,GPU不仅可以处理新的图形算法,还可以提高一般运算和物理运算的效率。
和前代GPU相比,GeForce GTX 200 GPU内部的输出缓冲架构尺寸提升了6倍,因此提供快得多的几何着色和流输出效能。上图显示最新的RightMark 3D 2.0 Benchmark测试成绩,其中包括几何着色测试。GeForce GTX 280 GPU的效能比前代GPU和竞争对手产品快得多。
比起G80一代,GTX 200的寄存器数量翻了一倍。寄存器是比缓存拥有更高的读取和写入速度,是处理核心与缓存之间的桥梁。大量的寄存器也是NVIDIAG80与GT200线程处理器异步频率运行的基础,因为线程处理器主要依赖于寄存器,不像纹理映射单元一样频繁访问显卡内存。而寄存器的访问速度与延迟到非常低,因此流处理器才可以比纹理单元拥有更高的运行频率。 在G80 GPU中,遇到了超长的Shader指令时,寄存器就会爆满,这时就需要与外缓存交换数据。而更大容量的寄存器可以保证存储更长更复杂的Shader指令,与存储器交换数据的几率就会变小,那么需要等待的数据延迟自认就会变小,因此GeForce GTX 280可以保证指令更快更有效率的执行。 现在游戏越来越多地采用更加复杂的着色程序,因此需要更多的寄存器空间。扩展寄存器的容量虽然会导致芯片的体积增大,不过增大的部分也是微不足道的,在在接受的范围内。通过上图的表格,我们可以看到,当寄存器的容量增大了1倍之后,在3D Mark Vantage的得分也相应得到了大幅提升。因为GPU可以运行更长,更复杂的指令,大大提高了处理效率。
Dual-Issue是指标量指令+矢量指令并行处理能力,其实在NVIDIA的产品上,Dual-Issue一直是一个有意思的话题,NV30不支持Co-Issue导致产品并行能力较差,因此在NVIDIA在NV40时期加入了Co-Issue功能,并且命名为Dual-Issue,与之前的Co-Issue相比,执行方式上也更灵活,不仅支持常见的3D+1D,还可进行了2D+2D的操作。而到了G80时期,由于流处理器单元采用了1D标量的处理方式,因此在进行图形运算时Co-Issue功能并没有被开启,不过在进行CUDA通用计算时却可以开启。
NVIDIA一直对外宣称G80拥有518GFlops的浮点运算能力,而进行图形运算时却只能达到345GFlops,后来在G84/86中在图形运算时也开启了Dual-Issue功能,不过可惜的是在G92中,Dual-Issue功能还是被取消了。 GT200中终于又可以支持Dual-Issue功能了!GeForce GTX 200的SM当中特殊功能单元(SFU)主要负责复杂算术计算、归属解释和执行浮点MUL指令。通过采用SP的MAD单元,来在每时钟周期执行1个MUL和ADD操作,GeForce GTX 200 GPU当中的单个流处理核心现在几乎可以用全速Dual Issue的方式来进行累加(MAD)操作和MUL操作(3flops/SP)。同时,在相同的时钟周期内采用SFU来进行另外一次MUL操作。优化和直接的测试显示,效率比前代GPU提升93-94%。 GeForce GTX 200 GPU当中全部的SPA单元,可以提供将近1 Tereaflop的峰值单精度IEEE754浮点运算效能,接近G80的3倍。NVIDIA的演示文档里用3DV的两项GPU物理性能运算来比较Single-Issue与的理论指标,我们后面会有针对Dual-Issue的测试。 GTX 200同样提供了一种更为平衡的纹理寻址和填充组合,每10个TPC阵列包括一组2-4比例纹理单元组合,每个时钟周期能够完成8个像素的双向性,或者是4个2:1比例的异向性过滤,或者4个FP16 双向性过滤操作。
GeForce 8800 GTX当中内建的8个TPC阵列,每时钟周期可以为64个像素进行纹理过滤,可以同时为32个像素进行纹理寻址及2x各向异性双线性过滤(8bit整数),或者32双线性过滤的像素(8bit整数或者16bit浮点)。GeForce 8800 GTX之后的GeForce 8和9系列GPU平衡了纹理寻址和纹理过滤。 例如,GeForce 9800 GTX每时钟周期可以寻址和过滤64个像素,每时钟周期支持64双线性过滤的像素(8bit整数)或者32双线性过滤的像素(16bit浮点)。

G80纹理单元TA:TF=1:2,G92改进为1:1 GeForce GTX 200 GPU也提供纹理寻址和纹理过滤的平衡,GeForce GTX 200 GPU当中10个TPC当中每个TPC都包含1个双块纹理单元,每时钟周期可以寻址和过滤8个双线性像素,或者4个2:1各向异性过滤的像素,或者4个FP16双线性的像素。GeForce GTX 200 GPU全部的双线性纹理寻址和过滤效能是每时钟周期80个像素。
| 理论填充率
| 3DMark测试结果 | 测试与理论效率比 | Geforce 9系列 | 33,660 | 25,600 | 76.2% | Geforce GTX 200 | 51,840 | 48,266 | 93.1% | GTX 200使用了一种更高效的管理器,允许GPU核心获得接近理论峰值的纹理填充率。根据NVIDIA内部的测试数据,在实际的游戏或软件应用中,GTX 200的纹理过滤性能要比Geforce 9800系列快22%。
显卡的讨论总是离不开像素、纹理、顶点、ROP等这些最基本的功能单元,而这些单元的比率问题再每一代都会有所不同,而这也是游戏发展之路的真实写照。最早像素单元与纹理单元的比值为1:1,而后来人们发现当时游戏不需要更多的像素处理单元,因此GPU厂商们更愿意在纹理单元的数量上下功夫,例如我们熟知的NV30以前产品,其像素单元与纹理单元比值为1:2,而AMD-ATI的RV200更是做到了1:3,当游戏越来越注重像素运算的时候,R300首次采用1:1的像素与纹理比值,后来NV40也跟进这一比值,而后R530上像素与纹理比值破天荒的达到了3:1,之后的游戏也证明更大的像素/纹理值更加适应游戏的发展,G80时达到了2:1。
NVIDIA的纹理单元与AMD-ATI的设计思路不同,NVIDIA是将纹理单元直接绑定在SM中,同核心及衍生产品的SP单元与纹理单元比值相同,这样可以使数据响应延迟比较低;而AMD-ATI则是将纹理单元独立于像素单元之外,因此可以根据高中低端产品设置不同的流处理器与纹理单元比值,甚至L2缓存也可以做到不同。
GeForce GTX 200 GPU设计因此从平衡着色和纹理,发展到更高的着色和纹理比率。通过每个TPC多加入1组SM单元,同时保持纹理硬件不变,这样每个TPC中流处理器个数达到了24个,而纹理单元则仍停留在8个,由于GT200拥有10组TCP,因此纹理总数为80个。
对比G80,现在GeForce GTX 200 GPU当中着色/纹理的比率已经提升50%。这样GT200的纹理处理能力达到了48GT/s,虽然对比G80有所提升,不过像素单元与纹理单元的运算效能比值仍旧从G80的14:1提升到19:1,这是因为GT200的流处理器能力提升的更高。
上代GeForce 8系列拥有6组ROP,每组可以处理4个像素,因而一共可以每时钟可以处理24个包含颜色和Z信息的像素。如果是Z-only处理,则可以实现每时钟192个单像素的处理。如果是4x multisampled antialiasing打开,则可以完成48个Z-only操作。

G80 16X CSAA GeForce 8系列当中ROP光栅单元支持多重采样反锯齿、超级采样反锯齿、透明自适应反锯齿和覆盖采样反锯齿。也支持浮点(FP16和FP32)渲染目标表面的帧缓冲混合,用来和多重采样反锯齿结合,达成出色的HDR渲染质量。
GT200图形计算架构模型 G80内建6个ROP Array,每时钟周期可以输出24个像素,混合12个像素,GeForce GTX 280则内建,8个ROP Array,每组包括4个ROP单元,下图中黄色框内为一个完整的ROP单元,总量达到32个,每时钟周期可以输出32个像素,混合32个像素。 GeForce GTX 200 GPU的ROP子系统支持前代GPU所有的ROP功能,并且每时钟周期提供最大32个像素的输出功能(4个像素/每ROP分区x8个ROP分区)。GeForce GTX 200 GPU当中每个ROP分区支持8xMSAA情况下,最大32个色彩和Z轴采样。采用U8(8bit未分配整数)数据格式的像素混合速度,比前代GPU的速度提升了2倍。 |