GPU通用计算发展历程简析
前言:Folding@home(蛋白质折叠过程研究)项目GPU客户端的推广,使得普通玩家也有机会体会GPU通用运计算能力,让显卡也能成为支持公益事业的重要力量。分布式计算的原理让普通PC在安装一个简单的软件后,即可与互联网相连接,变身为强大的超级计算机,高深的大规模并行计算由此变得平易近人。在体会GPU通用计算能力之后,我们对当今GPU的发展方向和整个行业的变化速度感慨万千……
● GPU通用计算发展历程简析
Folding@Home是一款基于分布式原理的蛋白质折叠计算软件,通过这个软件可以让全球众多空闲的PC连接起来,一起并行计算各种蛋白质折叠,从而缩短人类对于癌症、阿兹海默症、帕金森氏症等的攻克过程。该项目在几年前一直是依靠CPU运算提供支持,而自从AMD和NVIDIA的显卡加入运算后,项目进行速度获得了极大提升。全世界无数玩家用自己的显卡为医学研究做出了重大贡献。
10年前我们所有人都认为显卡服务于制图、动画、游戏等电子娱乐领域,这没有错。因为GPU(Graphic Processing Unit 图形处理器)发明的目的就是为了应对繁杂的3D图像处理。GPU的工作通俗的来说就是完成3D图形的生成,将图形映射到相应的像素点上,对每个像素进行计算确定最终颜色并完成输出。但是谁都没有想到10年后的今天,GPU的内部架构和应用范围已经发生了翻天覆地的变化。
NVIDIA和ATI在通用计算方面竞争激烈
最早的图形处理器其实就是在卡上搭配了一个几何加速器,用来提高顶点的吞吐量和加速几何变换、打光等操作,这样的搭配方式成本很高,只有在工作站产品上才会看到。3dfx的Voodoo1当初之所以能取代巨大反响,在于它能在当时的制造工艺条件下提供一个可以解决3D渲染流水线大部分问题的方案:Setup、纹理映射、Z-buffer等等。但此时的GPU依然没有解决图形处理中CPU负担过重的问题,同时GPU还不具备着色器(Shader)单元。
NVIDIA公司在1999年发布GeForce 256图形处理芯片时首先提出GPU的概念。GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬体T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬体T&L技术可以说是GPU的标志。
传统的GPU渲染流水线
过去10年间,图形处理器(GPU)在台式电脑中的使用已非常普遍。GPU具有强大的计算能力和很高的存储带宽,而这两点对于高性能三维图形应用是至关重要的。以往GPU计算都是专用于这些应用的,但现在新型的GPU允许具备一定的用户可编程性,这就使得GPU能够面向更通用的计算。
2001年,NIVIDA公司的GeForce 3首先引入了可编程的顶点着色器(Vertex Shader)单元。紧接着在2002年,可编程的像素着色器(Pixel Shader)单元也加入了GPU。对GPU通用计算进行深入研究从2003年开始,并提出了GPGPU概念,前一个GP则表示通用目的(General Purpose),所以GPGPU一般也被称为通用图形处理器或通用GPU。
GPU逐渐体现出强大的浮点运算能力
随着GPU计算能力的不断增长,一场GPU革命的时机也成熟了。GPU已经从由若干专用的固定功能单元(Fixed Function Unit)组成的专用并行处理器,进化为了以通用计算资源为主,固定功能单元为辅的架构,这一架构的出现奠定了GPGPU的发展基础。在SIGGRAPH 2003大会上,许多业界泰斗级人物发表了关于利用GPU进行各种运算的设想和实验模型。SIGGRAPH会议还特地安排了时间进行GPGPU的研讨交流。
可惜的是当时的GPU大多只能支持Shader Model 2,无论在指令长度还是流控制方面都无法满足最基本的通用计算需要,这让GPGPU的研究进度变得缓慢。到了DirectX 9 Shader Model 3.0时代,新的Shader Model在指令槽、流控制方面的显著增强使得对应GPU的可编程性能得到了大大的提升。GPGPU的研究由此进入快车道。
SIGGRAPH 2003大会开始深入研究GPU通用计算
GPGPU项目研究中的先行者是英国剑桥大学的BionicFx课题组。早在2004年9月,剑桥大学的BionicFx课题组便宣布在NVIDIA的GeForce FX 5900产品中实现了专业的实时音频处理功能,并且准备进行商业化的运作,对其产品进行销售,给音乐创作者带来实惠。
在随后的一段时间,GPGPU进入了深入研究阶段,但是由于编程语言架构和编程环境都难以通用,该领域的发展能力受到广泛质疑。就在人们认为GPGPU的研究即将偃旗息鼓的时候,ATI在2006年8月惊人地宣布即将联手斯坦福大学在其Folding@Home项目中提供对ATI Radeon X1900的支持。在显卡加入Folding@Home项目后,科研进展速度被成倍提升,人们第一次感受到了GPU的运算威力。
毫无疑问,在GPGPU研究上,ATI跨出了极具意义的一步。同时将GPGPU的应用领域和普及程度推向高潮。随后NVIDIA凭借GeForce 8800GTX这款业界首个DirectX 10 GPU,在GPU通用计算方面实现了大步跨越,特别是CUDA概念的提出(该工具集的核心是一个C语言编译器),在新的通用计算领域后来居上。
GPU计算开始在更多领域发挥作用
如图,GPU在很多领域的研究中已经开始发挥作用。支持DirectX 10显卡的首次出现是一个分水岭:过去只能处理像素或者只能处理顶点的专门功能处理单元被通用的统一着色器架构(Unified Shader Architecture)取代了,开发人员可以更轻松的对统一着色器进行控制。以AMD R600和NVIDIA G80为代表的DirectX10时代GPU能够提供了超越以往任何GPU的能力:它们拥有数百个功能单元,能够处理很多过去只能在CPU上运行的并行问题。
GPGPU将应用范围扩展到了图形之外,无论是科研教育、财务计算,还是在工业领域,GPGPU都得到了广泛的使用,关于它的科研成果和新应用模式也层出不穷。许许多多令人鼓舞的结果已经表明:将GPU用于解决数据并行计算问题可以明显提高系统的运行速度。
濮元恺所写过的技术分析类文章索引(持续更新) | |||
显卡只能玩游戏? 10年GPU通用计算回顾 |
|||
别浪费你的电脑 分布式计算在中国 |
Computex独家泄密 解析AMD下代GPU |
Folding@Home项目原理与特性
● Folding@Home项目原理与特性
Folding@home是一个研究蛋白质折叠,误折,聚合及由此引起的相关疾病的分布式计算项目。我们使用联网式的计算方式和大量的分布式计算能力来模拟蛋白质折叠的过程,并指引我们近期对由折叠引起的疾病的一系列研究,找到相关疾病的发病原因和治疗方法。
Folding@home能了解蛋白质折叠、误折以及相关的疾病。目前进行中的研究有:癌症、阿兹海默症(老年失智症)、亨廷顿病、成骨不全症、帕金森氏症、核糖体与抗生素。
Folding@Home项目简介
您可以在斯坦福大学官方网页上下载并运行客户端程序,随着更多志愿者的计算机加入,此项目计算的速度就越快,就会计算出蛋白质在更长时间内的折叠,距离科学家找到最终答案也就越来越近。如果蛋白质没有正确地折叠将会使人得一些病症:如阿兹海默氏症(Alzheimers)、囊肿纤维化(Cystic fibrosis)、疯牛病(Mad Cow, BSE)等, 甚至许多癌症的起因都是蛋白质的非正常折叠。
Folding@home所研究的是人类最基本的特定致病过程中蛋白质分子的折叠运动。项目的核心原理在于求解任务目标分子中每一个原子在边界条件限制下由肽键和长程力等作用所导致的运动方程,进而达到实现模拟任务目标分子折叠运动的目的。每一个原子背后都附庸这若干个方程,每一个方程都可以转换成一组简单的向量指令。同时由于长程力的影响,条件分支也随处可见,Folding@home在GPU使用量上也要大于图形编程。
Folding@home的客户端利用了经修改的TINKER、GROMACS、AMBER及CPMD这四款分子模拟程式进行运算,并会在许可的情况下作出优化,以把运算速度加快。这四款模拟程式也被修改成多个不同版本,供多款作业平台使用。Folding@Home中最主要的核心是GROMACS,这是一个经过特殊许可的非GPL版本的GROMACS作为客户端。GROMACS全名为:GROningen MAchine for Chemical Simulations,这是一款由荷兰Groningen大学开发的分子动力学模拟软件包,现在则主要由Uppsala大学, 斯德哥尔摩大学 以及马普学会聚合物研究所共同维护。
在分子动力学领域广泛使用的GROMACS引擎
由于针对不同的系统其代码进行了高度优化,GROMACS是目前最快的分子动力学模拟软件。此外,由于支持不同的分子力场以及按照GPL协议发行,GROMACS拥有很高的可定制性。GROMACS目前最新版本为4.07,可以到官方网站下载并自行编译。GROMACS支持并行/网格计算扩展,可灵活搭配MPI规范的并行运算接口,如MPICH、MPICH2、MPILAM、DeoinMPI等。国内也有很多分子动力专业人员同样使用GROMACS做研究,而且几乎是全部,GROMACS几乎成为模拟蛋白质折叠领域内的标准。
蛋白质在生物学中充当如此重要的角色, 科学家开始对人类的基因组开始排序。基因组实际上是一张跟蛋白质有关的“蓝图”——基因组包含遗传密码(DNA Code),这些密码决定着氨基酸串成蛋白质长链的顺序。最令人惊讶的不仅是蛋白质本身能够自我组装——折叠,而且是它们自我组装的速度是如此之快:一些蛋白质能够在百万分之一秒之内完成自我折叠。
虽然这个时间在人的时间表中是非常快的,但是用计算机进行模拟,这个时间就显得相当长了。实际上,计算机模拟1纳秒(1/1,000,000,000秒) 需要花费大约一天的时间。不幸的是,蛋白质折叠是以数十毫秒(10000纳秒)作为时间表的。所以我们必须借助分布动力学——一种“将工作单元分解成多个部分,使用多台处理器来模拟”的办法来冲破毫秒障碍。
Folding@Home项目发展概况
● Folding@Home项目在中国的发展与概况
2006年9月底,ATI宣布了通用计算GPGPU架构,并得到了斯坦福大学Folding@Home项目的大力支持,加入了人类健康研究。2007年3月22日,PS3正式加入史丹佛大学分布式运算研究计划,至今已有超过百万名 PS3 玩家注册参与。NVIDIA于2008年6月宣布旗下基于G80及以上核心的显卡产品都支持该项目的通用计算,更是对分布式计算的重要贡献。
中关村在线搭建的单卡FAH项目运算平台
Folding@home在自身定位明确、成功发展的基础下,通过斯坦福大学的大力推广,已经获得了全世界广泛认同。而近期PS3和GPU的参与更是将Folding@home的运算能力推向高峰。值得一提的是NVIDIA在2008年6月果断宣布加入Folding@home项目,至今已经为该项目提供了超过2 PFlops运算能力。
目前Folding@Home已经成为全世界最有影响力和公信力的项目,同时是各大厂商和机构鼎力支持的项目,当然它毫无疑问地拥有最广大的志愿者团队——截止2010年4月18日,全球共计1,396,683人参与该项目,最近的统计显示志愿者贡献的总运算能力已经达到了5PFlops,远超现在全世界最快的超级计算机IBM Roadrunner(最高性能1.026PFlops)。
该项目在中国拥有约2000多名参与者,其中最强大的China Folding@Home Power(Folding@Home中国力量,团队编号3213)团队已经拥有2585人,最近活跃用户200人以上,目前贡献计算量排名世界第47位,团队整体运算能力约为50到100TFLOPS。
目前的GPU通用计算发展迅速,在通用性方面已经与CPU不相上下,在浮点运算量方面则远超CPU。不仅仅是我们看到的Folding@home项目支持GPU运算,在2008年5月,法国原子能委员会等机构正准备打造一台新的超级计算机,其中不但会有Intel的下一代四核心处理器,更会加入192颗GTX200图形核心。在3GHz频率下,每颗处理器的浮点运算能力为96GFLOPS,1068颗Nehalem Bloomfield四核心处理器合计约103TFLOPS,而192颗GT200则能提供192TFLOPS。虽然GPU的数量只有CPU的18%,但计算能力却比后者高出86.4%,单颗对比的话更是将近10:1。
下面节选一段近期的Folding@home项目论文(第61号论文):
利用计算筛选确定流感红血球凝集素蛋白质重要变异并公开其结构(26XX任务段的成果):
下载地址:http://psb.stanford.edu/psb-online/proceedings/psb09/kasson.pdf
流感红血球凝集素蛋白质的主要作用是绑定目标细胞,并破坏细胞膜将病毒基因注入目标细胞。
因为长时间以来H5N1和H1、H3以及乙型流感病毒外壳的细微差别很难被精确的区分出来,通过大致结构的区别并不能使人们对掌握H5N1对人类细胞的入侵过程。通过2600+任务段的模拟,目前斯坦福已经完成了各种流感病毒外壳结构来的比对和筛选,对应的病毒对人类细胞的完整侵蚀过程的模拟目前仍在继续中。
将GPU功能单元映射为通用单元
● 将GPU功能单元映射为通用单元
基于GPU的计算从概念上讲很容易理解,并且现有多种高级语言和软件工具可以简化GPU的编程工作。但是开发人员必须首先了解GPU在图像绘制过程中是如何工作的,然后才能确定可用于计算的各个组件。为了着手把一般性的计算映射到GPU的专用硬件中,必须先确定GPU提供的各种计算资源,下面我们将简单了解GPU通用计算中各硬件系统的作用。以下资料由英国NVIDIA公司的开发工程师Mark Harris提供。
可编程并行处理器:GPU有两类可编程处理器,即三角顶处理器和像素处理器。顶点处理器负责处理顶点数据流(由位置、颜色、标准向量和其它属性),它们是组成三维几何模型的元素。依据每个顶点相对于其视点的位置,顶点处理器用顶点渐变程序对其转换。
像素处理器将像素渐变程序用于处理每个输出像素以确定其最后的颜色。顶点处理器和像素处理器是完全可编程的,可以对四个不同的数值同时执行一条指令。这是因为图形的基本要素或者是位置(X、Y、Z、W)或者是颜色(红、绿、蓝、alpha)。
光栅处理器:在顶点处理器转换完顶点之后,每三个一组的顶点就用来计算一个三角形。从这个三角形出发,光栅处理器生成一个像素流。该光栅处理器的功能非常专一,就是表现这些三角形,因而不是用户可编程的,但可将它看成是一个地址内插器和一个数据放大器(因为它根据几个三角顶就可生成许多像素)。
纹理单元:顶点处理器和像素处理器能以纹理(图像)的形式访问存储器。该纹理单元可被看成是一个只读存储器接口。当前的GPU可以将一个输出图像写到纹理结构存储器,而不是写到帧缓存器。这个纹理渲染功能是基本的,因为它是将GPU输出直接反馈到输入的唯一现有机制,这个过程无须返回到宿主处理器。纹理渲染可被看成是一个只写存储器接口。
本次Fermi架构显卡所使用的CUDA运算核心
数据类型:当涉及数据类型时,现有的GPU比CPU更受限制。它们只支持定点或浮点形式的实数。如果没有一些图形编程方面的知识,初涉GPU编程可能会感觉麻烦。在CPU和GPU之间做某些非常简单的类比是有益的。
GPU纹理 = CPU矩阵:GPU上的基本矩阵数据结构是纹理(图像)和顶点矩阵。在CPU上用到一个数据矩阵的地方,也就是在GPU上用到一个纹理的地方。
GPU渐变程序 = CPU内循环:在CPU中,一个循环可重复用于一个数据流(存在一个矩阵内)内的各个元素,用该循环体内的各条指令处理这些元素。在GPU中,类似的指令可写在一个渐变程序之内,并自动应用到相应数据流的所有元素上。在这个计算中并行处理的数量取决于该GPU中处理器的数量。
纹理渲染 = 反馈:为了在GPU中实现反馈,纹理渲染功能必须用来将一个碎片程序的结果写到存储器中,该存储器随后可用做未来其它程序的输入。
几何光栅 = 计算启动:为了启动GPU中的计算,只需画个简单的几何图形。顶点处理器将转换它,而光栅单元将决定它所涉及的输出缓存器中的像素值,并为每个元素产生一个碎片。由于表示一个矩阵的方形碎片流中的每个元素一般都要经过处理,因此在GPU编程中启动通用计算最常见的手段就是用一个方块。
GPU内部通用计算代码运算过程
● GPU内部通用计算代码运算过程
在绘制图像时,GPU首先接收宿主系统以三角顶点形式发送的几何数据。这些顶点数据由一个可编程的顶点处理器进行处理,该处理器可以完成几何变换、亮度计算等任何三角形计算。接下来,这些三角形由一个固定功能的光栅器转换成显示在屏幕上的单独“碎片(fragment)”。在屏幕显示之前,每个碎片都通过一个可编程的碎片处理器计算最终颜色值。
计算碎片颜色的运算一般包括集合向量数学操作以及从“纹理”中提取存储数据,“纹理”是一种存储表面材料颜色的位图。最终绘制的场景可以显示在输出设备上,或是从GPU的存储器重新复制到宿主处理器中。
两向量相加的简单Brook代码示例
图为执行两向量相加的简单Brook代码示例。Brook支持所有带附加流数据的C句法,流数据存储于GPU的存储器中,而核函数也在GPU上执行。可编程顶点处理器和碎片处理器提供了许多相同的功能和指令集。但是,大部分GPU编程人员只将碎片处理器用于通用计算任务,因为它通常提供更优的性能,而且可以直接输出到存储器。
利用碎片处理器进行计算的一个简单例子是对两个向量进行相加。首先,我们发布一个大三角形,其所包含的碎片数量和向量大小(容纳的元素)相同。产生的碎片通过碎片处理器进行处理,处理器以单指令多数据(SIMD)的并行方式执行代码。进行向量相加的代码从存储器中提取两个待加元素,并根据碎片的位置进行向量相加,同时为结果分配输出颜色。输出存储器保存了向量和,这个值在下一步计算中可以被任意使用。
可编程碎片处理器的ISA类似于DSP或Pentium SSE的指令集,由四路SIMD指令和寄存器组成。这些指令包括标准数学运算、存储器提取指令和几个专用图形指令。
更加优秀的通用计算API
● 更加优秀的通用计算API
优秀的编程模型能给帮助基于此架构的产品迅速发展,在这个领域各家厂商都尽全力推广自己的编程架构,因为只有程序员认可这套编程模型,最终的产品才有生命力。目前的“OpenCL”、“Stream”、“Compute Shader”和“CUDA模型C语言包”都是面向异构系统通用目的并行编程的开放式、免费标准,也是统一的编程环境。便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
众多厂商鼎力相助的OpenCL工作组
OpenCL实际上是针对异构系统进行并行编程的一个全新的API,OpenCL可以利用GPU进行一些并行计算的工作。我们知道,图形里面有很多API,比如OpenGL是针对图形的,而OpenCL则是针对并行计算的API。OpenCL开发人员可以利用GPU和CPU的计算能力,把GPU和CPU异构的系统运用在很多并行计算的领域。
Stream是AMD提出的GPGPU编程接口。基本上还是基于一种传统CPU的一种方式,Stream主要包括CAL与Brook+。CAL是一套指令集,可以用汇编语言的方式来开发软件,然而我们汇编方式开发软件的话,对搞计算的人来说不大现实,让他们用汇编语言来说的话可能确实是一个折磨。Brook+是斯坦福大学开发的,它是类似于C语言的东西,是把底层GPGPU的计算方式类似于C的这种语言,这里要说明的是Brook+不是C语言而是类C语言,语法和C语言比较类似。
Compute Shader技术是微软DirectX 11 API新加入的特性,在Compute Shader的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力,也就是我们说的GPGPU的概念和物理加速运算。多线程处理技术使游戏更好地利用系统的多个核心。Compute Shader主要特性包括线程间数据通信、一整套随机访问和流式I/O操作基本单元等,能加快和简化图像和后期处理效果等已有技术,也为DX11级硬件的新技术做好了准备,对于游戏和应用程序开发有着很重大的意义。
而NVIDIA提出的CUDA架构主要包含两个方面:一个是ISA指令集架构;第二硬件计算引擎;实际上是硬件和指令集。也就是说我们可以把CUDA看作是与X86或者cell类似的架构,但是CUDA基于GPU,而不是传统的CPU。实际上CUDA是NVIDIA的GPGPU模型,它使用C语言为基础,可以直接以大多数人熟悉的C语言,写出在显示芯片上执行的程序,而不需要去学习特定的显示芯片的指令或是特殊的结构。
OpenCL与CUDA在编程模式方面的区别
OpenCL是一个API,在第一个级别,CUDA架构是更高一个级别,在这个架构上不管是OpenCL还是DX11这样的API,还是像C语言、Fortran、DX11 Computer Shader,都可以支持。作为程序开发员来讲,一般他们只懂这些语言或者API,可以采用多种语言开发自己的程序,不管他选择什么语言,只要是希望调用GPU的计算能,在这个架构上都可以用CUDA来编程。CUDA架构与OpenCL是包容关系,我们把他们放在同一级别进行讨论本来就是错误的,与OpenCL在同一级别不是CUDA架构,而是CUDA的C语言包,也就是我们常说的CUDA版本。
Folding@home项目的GPU客户端版本是最早利用Stream来开发的应用软件之一,当然也是名气最大的。NVIDIA进入以后使用CUDA的语言来写Folding@home客户端的软件,CUDA的C语言包可以说是真正在GPU上运行的C语言,脱离了对图形学API的依赖,它近乎完美地使用了C语言的存储体系,把大部分的数据尽可能的在Shared memory上进行计算。极大提高GPU运算效率。
不管C语言还是Fortran,与OpenCL、Computer Shader这种API都是长期共存的关系。通过GPU通用编程语言的迅速发展,我们非常欣喜地看到越来越多的通用计算程序出现,显卡已经远远不止是娱乐工具,而变身为高性能并行计算机。优秀的编程模型配合高性能硬件系统,让个人和小型科研机构也可以非常轻松地配置自己的高性能计算机平台。
着色器模型变化历程与总结
● 着色器模型变化历程与总结
在图形渲染中,GPU中的可编程计算单元被称为着色器(Shader),着色器的性能由DirectX中规定的Shader Model来区分。GPU中最主要的可编程单元式顶点着色器和像素着色器。
为了实现更细腻逼真的画质,GPU的体系架构从最早的固定单元流水线到可编程流水线,到DirectX 8初步具备可编程性,再到DirectX 10时代的以通用的可编程计算单元为主、图形固定单元为辅的形式,最新的DirectX 11更是明确提出通用计算API Direct Compute概念,鼓励开发人员和用户更好地将GPU作为并行处理器使用。在这一过程中,着色器的可编程性也随着架构的发展不断提高,下表给出的是每代模型的大概特点。
表:Shader Model版本演化与特点
Shader Model |
GPU代表 |
显卡时代 |
特点 |
|
1999年第一代NV Geforce256 |
DirectX 7 1999~2001 |
GPU可以处理顶点的矩阵变换和进行光照计算(T&L),操作固定,功能单一,不具备可编程性 |
SM 1.0 |
2001年第二代NV Geforce3 |
DirectX 8 |
将图形硬件流水线作为流处理器来解释,顶点部分出现可编程性,像素部分可编程性有限(访问纹理的方式和格式受限,不支持浮点) |
SM 2.0 |
2003 年 ATI R300 和第三代NV Geforce FX |
DirectX 9.0b |
顶点和像素可编程性更通用化,像素部分支持FP16/24/32浮点,可包含上千条指令,处理纹理更加灵活:可用索引进行查找,也不再限制[0,1]范围,从而可用作任意数组(这一点对通用计算很重要) |
SM 3.0 |
2004年 第四代NV Geforce 6 和 ATI X1000 |
DirectX 9.0c |
顶点程序可以访问纹理VTF,支持动态分支操作,像素程序开始支持分支操作(包括循环、if/else等),支持函数调用,64位浮点纹理滤波和融合,多个绘制目标 |
SM 4.0 |
2007年 第五代NV G80和ATI R600 |
DirectX 10 2007~2009 |
统一渲染架构,支持IEEE754浮点标准,引入Geometry Shader(可批量进行几何处理),指令数从1K提升至64K,寄存器从32个增加到4096个,纹理规模从16+4个提升到128个,材质Texture格式变为硬件支持的RGBE格式,最高纹理分辨率从2048*2048提升至8192*8192 |
SM 5.0 |
2009年 ATI RV870 和2010年NV GF100 |
DirectX 11 2009~ |
明确提出通用计算API Direct Compute概念和Open CL分庭抗衡,以更小的性能衰减支持IEEE754的64位双精度浮点标准,硬件Tessellation单元,更好地利用多线程资源加速多个GPU |
传统的分离架构中,两种着色器的比例往往是固定的。在GPU核心设计完成时,各种着色器的数量便确定下来,比如著名的“黄金比例”——顶点着色器与像素着色器的数量比例为1:3。但不同的游戏对顶点资源和像素资源的计算能力要求是不同的。如果场景中有大量的小三角形,则顶点着色器必须满负荷工作,而像素着色器则会被闲置;如果场景中有少量的大三角形,又会发生相反的情况。因此,固定比例的设计无法完全发挥GPU中所有计算单元的性能。
顶点着色单元(Vertex Shader,VS)和像素着色单元(Pixel Shader,PS)两种着色器的架构既有相同之处,又有一些不同。两者处理的都是四元组数据(顶点着色器处理用于表示坐标的w、x、y、z,但像素着色器处理用于表示颜色的a、r、g、b),顶点渲染需要比较高的计算精度;而像素渲染则可以使用较低的精度,从而可以增加在单位面积上的计算单元数量。在Shader Model 4.0之前,两种着色器的精度都在不断提高,但同期顶点着色器的精度要高于像素着色器。
Shader Model 4.0统一了两种着色器,所以顶顶点和像素着色器的规格要求完全相同,都支持32位浮点数。这是GPU发展的一个分水岭;过去只能处理顶点和只能处理像素的专门处理单元被统一之后,更加适应通用计算的需求。
DirectX 11提出的Shader Model 5.0版本继续强化了通用计算的地位,微软提出的全新API——Direct Compute将把GPU通用计算推向新的巅峰。同时Shader Model 5.0是完全针对流处理器而设定的,所有类型的着色器,如:像素、顶点、几何、计算、Hull和Domaim(位于Tessellator前后)都将从新指令集中获益。
GPU通用计算正在快速普及
● GPU通用计算正在快速普及
GPU是半导体芯片领域少数发展迅速同时应用范围得到极大扩展的芯片。自诞生起,GPU就将摩尔定律的定义大大扩展。研究表明,从1993年开始,GPU的性能以每年2.8倍的速度增长,这个数字大大超过了PC其他子系统的发展速度。在高密度的大规模并行运算领域,GPU已经完全有实力和传统的CPU竞争。
GPU运算能力约为同等级CPU十倍
截止2008年末,全球拥有1亿颗以上支持通用计算与编程的GPU产品,开发人员超过了2.5万人,全世界有50多所大学开设了GPU并行编程与应用课程,包括中国科学院、清华大学等,一个基于GPU的计算生态圈已初步形成。普通玩家也应该顺应潮流,不要固步自封只是把GPU当成娱乐工具,或者把CPU当作电脑中唯一的运算处理器,在更多领域大胆尝试GPU这种高密度运算器的优势。相信通用计算项目在不久的将来也必将成为显卡决胜的新战场。
上图为中关村在线显卡频道搭建的Folding@hemo项目协同工作平台,我们使用了一颗超频到3.5GHz的i7-870处理器和一块索泰公版GTX480显卡。这套平台同时运行了最近的GPU3客户端和CPU-SMP2客户端,并且使用了第三方FAHSPY软件进行管理监控。我们可以看到平台的用户名为zol.com.cn,加入团队3213(中国队)。借助于多线程处理器和Fermi架构显卡的帮助,这套平台总运算速度达到了27454PPD。
如果你没有条件或者没有必要购买超级计算机,又非常希望体验GPU运算带来的快感,参与体验分子动力学原理的生命科学类Folding@home项目就是最好的选择。只需要在斯坦福官方下载一个GPU版本客户端,并使用一块Geforce 8系列或者Radeon HD2系列或更高级别的显卡,你的电脑即可变身为一台高性能计算机。同时该项目属于志愿者分布式计算项目,加入这些有益于人类的开放性项目后,你的帮助可以改变世界。
这篇文章参考和引用了很多文献,同时也是我个人通过Folding@home项目对GPU通用计算从浅显认识到逐渐熟悉的过程,在这里感谢帮助过我的老师和朋友们,当然文章的完成更离不开China Folding@Home Power(Folding@Home中国3213团队)那些充满理想、守望信念的志愿者们。
附:在中国分布式计算总站,我们为读者提供了比较简洁明快的参与教程,很适合新手加入Folding@home项目:
http://www.equn.com/forum/thread-21586-1-1.html
=============================================================
本文参考文献:
[1] NVIDIA GeForce 8800 GTX测试报告
[2] NVIDIA's GT200——Inside a Parallel Processor
[3] 如何通过编程将GPU用于通用计算任务
[4] 现代GPU可解决数据并行处理问题
[5] 谁主沉浮 Open CL与CUDA架构深入解析