注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

My Unix World

不要迷恋Unix,Unix只是计算世界很小的一部分!

 
 
 

日志

 
 

【Copy】GPU通用运算新篇章深入分析  

2008-12-12 02:18:12|  分类: C-CPU |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
[文章简介]阅读 . 人次
由于图形硬件发展很快,一些新特性还在不断出现,GPGPU的周遍开发平台也在不断完善。如今,GPGPU已经悄然进入了我们的生活 (10766 字) 文章来源于小熊在线,
http://www.beareyes.com.cn/2/lib/200701/05/20070105016_0.htm


前言:GPU-前途无限光明

编辑:WolStame 测试/资料:来不及思考

前言:
随便拿起一个DIYer写下的一份PC配置单,图形卡(video card)往往是必不可少的部分。当被问及为何会钟情于独立的图形卡而不是选择主板自 带的集成显示芯片的时候,得到的答案往往惊人的一致——为了游戏。是的,人类仅仅是为了满足自己的七情六欲,我们的PC才拥有了无比强大的运算能力。甚至 比起同期的图形子系统,PC里其他各部分都相形见绌。从R300到NV40,再到现在最新的G80,每一代旗舰GPU的晶体管都大大超过了同期的顶级 CPU,也在挑战其同时代半导体工艺的极限。不过,GPU正如其名字“graphics processing unit(图形处理器)”一样,纵然有再强大的运算能力,也只能在其转司的实时图形渲染领域内一展手脚。仅仅靠娱乐市场就支撑起NV40和G80这种怪兽 级别的半导体芯片,这种情况让人难以想象。不过,既然在很多特定领域,GPU都能提供比同时代CPU更为强大的处理能力,那么是否有人想过让图形处理器来 替代CPU充当这些程序中运算的主角,或者是“帮助”CPU更快的完成运算任务呢?答案是肯定的。

似乎在一夜之间,GPU用于通用计算(General Purpose GPU)及其相关方面的问题成为一个十分热门的话题。GPGPU指的是利用图形卡来进行一般意义上的计算,而不是单纯的绘制。让人们感到惊奇的是,在计算 机图形处理器多年巡视发展的进程中,几乎没有人认真的预言过这一重大应用。而在今天,由于GPU具备了极高的性能和前所未有的发展速度以及普及率,似的人 们对于GPU的这一新的应用前景给予了空前高的期望和热情。下面一些数字也许能帮助你更加深刻的了解人们为什么对于GPU通用处理如此关注。

--> 自诞生起,GPU就将摩尔定律的定义大大扩展。研究表明,从1993年开始,GPU的性能以每年2.8倍的速度增长,这个数字大大超过了PC其他子系统的发展速度。小熊在线www.beareyes.com.cn

--> 一块工作频率为3.0GHz的Pentium 4处理器,其晶体管数目为1.25亿个,即使算上SSE指令集的SIMD(单指令并发多数据流,这种情况是浮点吞运算下吐能力的最理想状况),也只有 6GFlops的峰值浮点处理能力,而同期的一块NV40 GPU就有2.22亿个晶体管。峰值浮点运算能力很轻易超过40GFlops。

--> GPU拥有自己的独立子存储系统--显存,它拥有比系统主内存高得多的带宽。Intel曾经为它的Pentium 4 XE系列处理器所拥有的1066MHz前端总线所提供的8.6GB/S的带宽倍感自豪,而同期一块普通的GeForce 6800就拥有20GB/S以上的显存带宽。小熊在线www.beareyes.com.cn

由上面几点可以看出,因为具备强大的并行处理能力和极高的存储器带宽,GPU如果被抽象成一个“流处理器”(Stream Processor),来用于诸如科学运算、数据分析、线性代数、流体模拟等需要大量重复的数据集运算和密集的内存存取的应用程序,那么我们就能获得一些 比CPU强悍得多的计算能力。相比之下,CPU本质上是一个标量计算模型,计算单元偏少,主要针对复杂控制和低延迟而非高带宽优化。正是因为这些优势,使 得GPU比CPU更适用于流处理计算。目前,AMD和NVIDIA两大图形芯片巨头都提出了自己的GPGPU方案。小熊在线www.beareyes.com.cn

图形处理器渲染流水线的发展历程

2008年12月12日 - liqix - Liqix的程序世界


一.图形处理器的发展及GPGPU概念的引入(1)


基于GPU的通用计算是随着图形芯片的发展而发展起来的。当我们惊叹GPU近几年来不可思议的迅速扩展到通用计算领域时,简单的回顾一下图形处理器的主要发展进程是一件很有意义的事情。

在计算机图形学发展初期的20世纪六、七十年代,由于受硬件条件的限制,图形显示只是作为计算机输出的一种手段。在20世纪80年代问世的GE(Geometry Egine)和随后的Pixel Plane处理器标志这图形处理器的新时代,然而它们都距个人用户很遥远。小熊在线www.beareyes.com.cn

2008年12月12日 - liqix - Liqix的程序世界

自从1998年以来,GPU的功能迅速更新,平均每一年便有新一代的GPU诞生。第一代现代PC图形处理器出现在1998年后期,主要代表为NVIDIA TNT2,ATI Rage和3dfx Voodoo3。这些处理器主要处理光栅化部分,有些新片支持多纹理,可以在光栅化过程中完成多幅纹理的融合操作。从1999年后期开始,第二代图形处理 器(NVIDIA GeForce256,ATI Radeon)可以处理顶点的矩阵变换和光照计算,因此他们也被称为真正的GPU(Graphics Processing Unit),但最大的变革来于自第二代GPU。以NVIDIA的GeForce3为代表,它们首次引入了可编程性,可以将图形硬件的流水线作为流处理器来 解释。也正是这个时候,基于GPU的通用计算开始出现。第三代GPU以ATI Radeon9700为代表。相比第二代GPU,它们的象素和顶点可编程性得到了大大的扩展,可以包含上千条指令,访问纹理的方式更为灵活,可以用做索引 查找。最重要的是具备了对浮点格式的纹理的支持,不在限制在[0,1]范围内,从而可以做任意数组,这对于通用计算而言是一个重要突破。最近的第四代 GPU以Nvidia GeForce6800为代表,功能相对以前更加丰富、灵活。顶点程序可以直接访问纹理,支持动态分支;象素着色器开始支持分支操作,包括循环和子函数调 用,TMU支持64位浮点纹理的过滤和混合,ROP(象素输出单元)支持MRT(多目标渲染)等。

伴随着计算机仿真、计算机影视最主要还是PC游戏不断增长的需求,图形处理器的计算能力也一直在不断增长。从SGI的GE到NVIDIA的GeForce 8 GPU之间经历了20余年,芯片的线宽从3微米缩小到90纳米,集成电路的规模提高了几千倍,并且伴随着DirectX的重大发展,可编程性也获得了巨大 提高,当今GPU的灵活性已经与当年不可同日而语。这些急速膨胀的运算能力和功能现在将在通用计算领域找到新的应用舞台。

在图形硬件的可编程性普及以前,业内对于GPU通用计算方面就有一些研究。随着NVIDIA GeForce2的出现,多纹理技术被用来做一些通用计算,集合纹理环境参数和文理函数可以实现一些很灵活的应用。它们的基本思路都是利用Texture Shader进行数据访问,利用Register Combiner进行计算。其流程如下图所示

基于Register Combiner的通用计算的总流程

2008年12月12日 - liqix - Liqix的程序世界

数据以顶点颜色或纹理的形式传入Register Combiner,然后利用其SIMD流处理单元的能力完成4个颜色通道的向量化计算。小熊在线www.beareyes.com.cn


一.图形处理器的发展及GPGPU概念的引入(2)

以GeForce3为代表的可编程GPU发布后,GPGPU进入了一个高速发展的全新时代。相比固定的流水线,目 前硬件的可编程顶点和片段单元不管是运算精度,支持的指令数还是寄存器个数都有了很大提高,更重要的是基于Shader Model 3.0版本顶点和片段着色器版本的硬件开始支持动态流控制的循环和分支还有子函数操作。比如,现在的片段着色程序最多允许同时访问16个独立的纹理,支持 长度不受限制的指令数,寄存器个数也大大提高。而且提供了32位浮点精度的运算和存储格式,对于通用计算来说,这就很容易做出更为复杂的运算。小熊在线www.beareyes.com.cn

目前的GPU的渲染管线,深红色表示具备可编程能力

2008年12月12日 - liqix - Liqix的程序世界
上图是一张典型的可编程GPU的流水线示意图,其中可编程的顶点处理器(Vertex Shader)负责处理顶点数据流(包括位置、颜色,光照等)。因为顶点处理操作都是在空间的几何点上进行,因此Vertex Shader对于通用计算而言非常适合于几何操作类的计算。可编程片段着色器(Fragment Processor)在几何处理和转换完成后,负责为每个象素“画”上正确的色彩,它的ISA(系统体系结构)类似于DSP或SSE指令集,由 Folat4的SIMD执行单元和寄存器组成,处理的时候接受先从存储器中取出2个待加元素,根据片段的位置进行向量相加,向量和以颜色的形式被保存到存 储器中,可以当作结果输出或在下一步运算中直接被使用。处理的一般为4个单元的向量,因为RGB三种色彩加上Alpha通道数据正好是4。片段着色器包含 的TMU(Texture Mapping Unit)单元能以贴图的形式存取显存,因此可以被看作一个只读存取界面。小熊在线www.beareyes.com.cn

 


二.基于图形处理器的通用计算(1)

由于图形处理器并行流处理和可编程性的出现,越来越多的人开始用其做一些非绘制方面的计算。这些计算涉及的范围很光,从几何计算、碰撞检测、运动规划、代数计算、优化计算到复杂的偏微分方程求解等数不胜数。用GPU来做通用计算的例子很多,下面介绍几个有代表性的应用。小熊在线www.beareyes.com.cn

代数计算
这是基于GPGPU的最早的应用。在具体实现中,需要将盖幅纹理映射到一个与之匹配的矩形上,选取正投影模式,通过光栅化的过程来完成计算,输出结果为Framebuffer(帧缓存)或者纹理(Render to Texture)。入下图所示

两个矢量在GPU上的运算过程

2008年12月12日 - liqix - Liqix的程序世界

求矢量的削减运算过程

2008年12月12日 - liqix - Liqix的程序世界

 


二.基于图形处理器的通用计算(2)

流体模拟
流体模拟一直是计算机图形学中的热点问题,其在电影特效和游戏中的应用很多,而且在工程上的应用范围也非常广泛。为了能够很好的描述流动现象,一些非常复 杂的运动方程如Navier-Stokes方程组的求解极其的耗时,而且对时间步长又很敏感,容易导致结果发散。如果通过GPU的并行性和可编程性求解这 些有限差分方程,就能用很少的代价使整个模拟实时化

求解Navier-Stokes方程流程图

2008年12月12日 - liqix - Liqix的程序世界

基于GPU运行的城市气流流动的计算

2008年12月12日 - liqix - Liqix的程序世界

象粟级求解离散方程

2008年12月12日 - liqix - Liqix的程序世界

数据库操作
这类操作主要是对数据棵记录进行各类查询,其中包括关系查询(relatioal query)、合取选择(conjunctive selection)、聚集操作(aggregation)等。执行这类数据库操作的时候,GPU将本身的纹理存储用做记录数据库的属性,而利用片段处理 器对纹理进行并行操作并作检测,利用深度缓冲(depth buffer)和模板缓冲(stencil buffer)的深度检测和模板检测协助操作。举例来说,对数据库某属性项进行范围查询的操作的时候,首先将纹理存储(数据库项)拷贝到深度缓冲区,然后 调用其“深度界限检测”的功能去“检查”具有下界限深度的长方形,最后在模板缓冲区生成通过了“深度界限检测”的结果,对应于符合条件的数据库项。小熊在线www.beareyes.com.cn

频谱变换和滤波
频谱变换和滤波是比较适合于作SIMD运算和流处理的计算模型。一个在GPU上进行快速傅立叶变换(FFT)的过程是:利用frame buffer在两个纹理存储之间进行交换,使得不同趟的象素程序相继操作在前趟的执行结果上。小熊在线www.beareyes.com.cn


三.当前GPGPU所面临的问题

尽管GPGPU前途一片光明,但挑战与机遇永远是并存的,目前GPGPU所面临的问题也非常的多。

首先是当前的图形硬件还存在很大的局限性。GPU毕竟是为了图形渲染而生,其通用性离真正的通用处理器还有很大一段距离。比如,在DX9硬件 上,Vetxe Shader和Pixel Shader总共的指令数被制在1024(512+512)条指令,(片段着色器)Pixel Shader最多只能同时访问16个纹理,进行分支和循环操作的开销也比大。此外,片段着色程序虽然支持R16F的浮店类型数据格式,但缺乏其他类型的支 持,限制了通用运算的多样性,而且R16F这种单精度的IEEE格式对于通常所用的工程计算而言精度还是低了点。由于每个shader程序最多带32个 Temp寄存器,指令数也受到限制,所以在很多通用计算程序的编写中不得不采用multi-pass来完成一些复杂的运算,这样就降低了性能。由于整个 GPU只能通过顶点纹理来读取数据,通过渲染到纹理来写入数据,对于显存没有任何间接写指令,输出地址只能由光栅化引擎决定,不能由程序改变,无法进行任 意的读写操作,因此必须将计算的中间结果保存以避免多次读写,这又无形中降低了GPU的通用运算性能。另外在硬件上如果采用浮点运算,则不能利用硬件本身 的颜色混合操作,也不能进行mipmap的自动运算,这些也妨碍了GPU在通用计算上的应用。小熊在线www.beareyes.com.cn

然后就是软件和开发平台的限制。虽然基于GPU通用计算的软件研究及其开发已经取得很多进展,然而软件方面所存在的问题比硬件更甚。GPU编程仍然过于繁 杂。由于目前的主流GPU平台片段处理单元的计算模型和操作资源有限,功能也在较低层次,且受到流处理的读写种类等诸多限制,将通用计算的各种算法转换为 象素处理编程是一件很麻烦的事,为了充分利用有限资源和功能,需要设计者精心考虑。


四.G80-CUDA--全新的GPGPU解决方案(1)

Nvidia于06年底抢先发布了基于其下一代DX10渲染体系的旗舰GPU--G80。这块空前强悍的图形芯片集成了6.8亿个晶体管,具备数倍于前代 旗舰产品的运算能力和众多全新功能,一经发布立刻帮助NV夺占了性能之王的宝座。当众人为其强悍的3D渲染效能所惊叹时,有谁又会想到NV这次带来的将不 仅仅是图形渲染的革命呢?那些GPU通用运算的支持者和狂热的硬件发烧友这次将定要为G80给通用计算领域带来的变革目瞪口呆,让我们将G80这些激动人 心的新元素娓娓道来吧!

G80工作流程图
2008年12月12日 - liqix - Liqix的程序世界

统一渲染架构


四.G80-CUDA--全新的GPGPU解决方案(2)

在上文中,我们已经讨论过了传统GPU流水线中Veretx Shader和Pixel Shader的区别。对于shader基本模型非常相近的它们来说,在流水线中为它们专程开辟两块完全不同,资源难以共享的区域是非常浪费的一见事情。而 GPU通用计算通常都只会使用运算能力更加强大的片段着色器部分(Pixel Shader)来进行操作,这样顶点着色器的资源就完全空下来了,无疑是巨大的运算能力浪费。小熊在线www.beareyes.com.cn

分离式架构存在极大的资源浪费

2008年12月12日 - liqix - Liqix的程序世界

 

不过类似的问题在G80中将不复存在。G80完全遵照了微软最新一代DirectX10的统一渲染架构,通过一个整合的Streaming Shader Array(流着色流水线阵列)来完成目前Vertex Shader、Pixel Shader以及新引入的Geometry Shader(几何着色器)所有的工作。在G80的流水线中显示核心不再为Shader类型不同而配置不同类型的Shader单元,所有的Shader单 元都可以为需要处理的数据进行处理,不管是Pixel Shader数据还是Vertex Shader数据,调配哪几组Shader单元负责处理什么数据或者进行什么样子类型的计算,统统都由一个被称为small sets of instructions(SSI)的部分来控制。小熊在线www.beareyes.com.cn


统一shander保证了渲染管线的充分利用

2008年12月12日 - liqix - Liqix的程序世界


四.G80-CUDA--全新的GPGPU解决方案(3)


对于通用计算来说,统一渲染架构带来的好处是显而易见的。首先,程序设计者无需为不同的着色引擎设计不同的执行单元,也不必去考虑不同的着色模型在细节上的区别,所对应的接口以 及操作方式全部融为一体,这将在一定程度上简化复杂的开发流程。其次,由于执行单元的通用化,现在任何一个通用计算程序都将在G80上发挥它完全的运算能 力,不存在只使用到PS片段着色器而VS顶点着色器空闲的问题。而由于执行单元和配套资源的共享化,之前在分离架构硬件上一些难以克服的问题也将迎刃而 解。例如,很多基于GPU的通用运算都需要Vertex Shader具备纹理获取功能,来直接取得运算数据。在分离架构时代,这种工作都是通过VTF(顶点纹理拾取,相当于给Vertex Shader配备mini TMU,代价相当大)或者R2VB(Render to VS buffer,渲染到顶点缓存,限制相当大)来完成的。因为Vertex Shader和Pixel Shader天生的分离问题,即使Vertex Shader能够抓到数据,也会面临严重的延迟,性能难以达到需求。而在统一着色架构里这种情况就不复存在,因为每个执行单元即是VS也是PS,它们共享 了TMU和Cache部分的资源。另外,由于执行单元的共享,之前在分离架构硬件中将显存划分为纹理缓存,顶点缓存等小块的做法将被取消,现在任何应用都 能平行的调用显存资源。小熊在线www.beareyes.com.cn

虚拟显存体系
GPU在结构上限制通用计算的最大问题是缺少大容量的局部存储器。通用计算的主要平台片段着色器(Pixel Shader)能用于存储的只能是纹理存储器,也就是在显存中所划分出的纹理缓存。当前的最大容量也不过512MB(X1950XTX),这对于大量的通 用计算应用来说是一个很大的限制。而另一方面,GPU与容量巨大的系统主内存之间的沟通通道却一直缺乏发展。即使是双向点对点的PCI Express X16总线,也不过只提供了8GB/S的带宽,对于现在GPU动辄几十个GFlops的运算能力来说实在是杯水车薪。一旦需要动用到系统主内存里的数据,整个GPU的效能会大为下降。小熊在线www.beareyes.com.cn

虚拟显存体系的大哥--虚拟内存技术
2008年12月12日 - liqix - Liqix的程序世界]


不过,这一切在G80面前都已经成为了历史。G80支持微软在DirectX10中首次引入的一种新的显存虚拟体系--显存分页技术。类似与CPU的虚拟 内存技术,虚拟显存体系将虚拟显存段划分成4KB固定大小的单元页,每个页在需要之前可位于显存中,或在主内存里,当这个页面里有GPU流水线所需要的数 据时,GPU就能直接对虚拟显存进行寻址,加载这个页面的数据。这个新体系的角色实际上是管理分配实际显存页面帧并且解析程序对虚拟显存页面的引用。在支 持这个体系的模型中,所有的纹理、着色信息等被分成的小块,即使在低速总线上也能流畅传输。例如,一个4KB大小的页面相当于一个32X32X32bit 的纹理贴图。这样在需要纹理渲染时系统不需要传输太多的“页面”就能完成相应工作,做到这一切只会有和小的性能损失。小熊在线www.beareyes.com.cn


四.G80-CUDA--全新的GPGPU解决方案(4)

标量着色单元
前面我们多次提到,GPU从诞生以来,一直以Float4为基本单位的SIMD流水线作为运算单元,指令发射和执行能力是不对等的。对于GPGPU来说, 这种设计的好处是在指令发射数一定的情况下获得最高的并行能力。但这种架构需要程序的特别优化,前面也已经提到,利用GPU的片段渲染流水线进行通用计算 的时候一定要充分利用RGBA所对应的4个通道来获得SIMD架构的峰值性能,基于这种架构的GPU如果要想提升性能,最简单直接的办法就是增加片段着色 器的平行管线数量。从NV20到最近的R580,人们一直是这么做的。但这次G80提升运算能力的实现途径与以往截然不同。G80的渲染核心将通常GPU 中的3D+1D或者2D+2D这样执行能力为Float4的“大”向量SIMD单元拆分为单个执行能力为1D的“小”ALU,然后将这些ALU组成8个阵 列(TCP),每个TCP拥有16个ALU,它们被称做1D Scalar Streaming Processors。通过独特的内部分频技术,这些着色单元阵列工作在超过时钟频率2倍多的频率上(1.35GHz)。小熊在线www.beareyes.com.cn

G80的标量渲染单元
2008年12月12日 - liqix - Liqix的程序世界


在实际执行图形渲染的时候,同一个时间内每个TCP的数据类型并没有限制。也就是说,同一时间里,G80的标量流水线允许TCP1执行 VS+PS,TCP2执行VS+GS,TCP3完全用来执行VS,TCP4完全用来执行PS,开发人员无须为VS、PS代码的轻重比例而过分操心。这表明 G80的渲染流水线实际上已经是类似于MIMD(多指令多数据流)的结构。MIMD硬件非常适合异步并行算法。通常的SIMD架构硬件比较适用于各种同步 并行算法。它们之间的区别在于同步并行算法通过一个全局的时钟来控制各部分的步伐,将任务中的各个部分计算同步地向前推进;而异步并行算法各部分计算步伐 之间没有关联,互不同步。对于通用处理而言,异步并行算法比较适合大型线性方程组的求解,而同步并行算法比较适用于仿真送代方程之类的运算,因为它的每一 步中间结果都是我们所需要的结果,不允许出现丝毫的差错。
GPU通常都只能是把最常用的加法、乘法指令做成单周期指令,而像开平方等较复杂的指令在GPU上需要消耗若干个周期来完成。即使是最优化的 shader(着色器)程序,都可能包含不同长度的指令数,而且里面包含的指令也是五花八门,有些是耗时较长的内存操作指令,有些是上面我们说的开平方指 令、分支指令、乘加指令等。由于SIMD架构特殊的吞吐非对程设计,对于指令的适应能力较弱,在面对这些复杂情况的时候,流水线的平行性(co- issue)很容易就被破坏怠尽,从而造成运算能力的下降。MIMD架构的最大优势--指令吞吐能力平衡在此时就体现出威力了。不过,在通常都优化得相当 出色的通用计算程序方面,MIMD的这种优势体现得并不明显。小熊在线www.beareyes.com.cn

多执行诸体系 G80的Gigathread为整个流水线维持总共4096个平行线程
2008年12月12日 - liqix - Liqix的程序世界


四.G80-CUDA--全新的GPGPU解决方案(5)


实际上,G80整个GPU的源动力都来自于在Multi-Threading(多执行诸架构)方面的变化,这是一道严格科学而且富有效率的管理体系。
当数据从游戏引擎传送至G80图形核心的流水线之后,会被一个叫做GigaThread线程处理器的仲裁管理机构拆分成4096个平行线程,然后根据工作 负荷,自动分配执行顶点着色器、几何着色器、像素着色器指令。线程调度是硬件执行完全自动化的,GigaThread线程处理器会动态监测整个 shader array流水线的工作状况,一旦它发现其下某个着色单元由于等待数据或工作完成而处于闲置状态,就会马上递交一个新的线程供其执行。加上采用的是标量架 构,在任何着色程序中都将取得硬件的最高执行效率。小熊在线www.beareyes.com.cn

Batch Size对于分支性能的影响
2008年12月12日 - liqix - Liqix的程序世界


多执行诸体系对于G80的整个通用渲染运算来说都是至关重要的。在执行代数运算的时候,Multi-Threading要为整个流水线掩藏DRAM存取动 作所造成的延迟(DRAM的时钟周期往往比GPU内部时钟长几十倍,在存取命令发出到第一个数据包送出之前这段时间内只有能够维持住足够多平行线程的流水 线才会不至于停顿);在通用计算利用到动态分支功能时候,Multi-Threading为流水线带来的庞大平行性被用来缩小Batch size(Batch size越小,意味着在同一个象素块里遇到两条不同指令的可能性越小,SIMD平行度被破坏的可能性也越小);而G80的一个特色技术--CUDA也严重 依赖于多执诸架构,这点在后面会提到。小熊在线www.beareyes.com.cn

Geomerty shaders in DX10
2008年12月12日 - liqix - Liqix的程序世界


四.G80-CUDA--全新的GPGPU解决方案(6)


G80另一个重大变化就是在VS和PS之间引入了一个新的可编程图形层--几何着色器(Geometry Shader)。传统的GPU渲染流水线只能接受来自CPU的顶点建模数据,无法自己创建新的三角形,Geometry Shader改变了这点。它的作用就是对每个Vertex数据临近的数据进行Vertex函数处理。这种函数处理可以快速的把模型类似的顶点结合起来进行 运算。虽然其操作不会象Vertex Shader那样的进行完整的几何转换操作,只是处理器单个顶点的相关函数操作,但是这种操作却可以确定整个模型的物理形状,这将大大加速处理器速度。 Geometry Shader可以把点、线、三角等多边形联系起来快速处理、同时创造新的多边形,在很短时间内直接分配给其他Shader和显存而无需经过CPU。
为了最大程度的发挥Geometry Shader的威力,G80还专门设置了一个名为流输出层(Stream Output State)的部件来配合它使用。这个层的功能是将Vertex Shader和Pixel Shader处理完成的数据输出给用户,由用户进行处理后再反馈给流水线继续处理。它可以直接读写本地显存。我们可以通过Stream Out把GPU拆成两段,只利用前面的一段几何运算单元。对某些科学研究,也可以通过stream out来利用GPU的数学运算能力,等于在CPU之外又平白多得了一个数学协处理器。我们可以这样理解G80图形核心的Geometry Shader和Stream Out单元:GS提供了改变图形数量的能力,Stream out提供了硬件Multi-pass的支持。可以预见,今后围绕这些全新的功能,又会有一批新的GPU通用计算程序出台。小熊在线www.beareyes.com.cn

DX8 DX9 DX10的细节区别
2008年12月12日 - liqix - Liqix的程序世界


相比原先的ShaderModel 3.0,G80支持最新的ShaderModel 4.0版着色器。SM4.0允许的最大指令数从512条增加到了64000条,这样就能兼容更长的通用运算程序;临时暂存器数量也从原先的32个增加到惊 人的4096个,足够应付任何复杂的通用运算需求;允许同时对128个Texture进行操作(Shader Model 3.0只允许16个);材质texture格式变为硬件支持的RGBE格式,其中的"E"是Exponent的省略,是RGB共同的说明,在通用计算处理 过程中RGBE可以作为一种高效率的浮点材质压缩格式。SM4.0还首次引入了整数指令集。相比浮点格式的不确定性,精准的整数指令集将为分支等应用带来 新的改变。G80的流处理器除了能够执行FP32的shader外,还可以在GPGPU应用中提供FP64或者双精度计算,这对于工业标准的计算是一个很 有意义的加强,毕竟大部分工业应用首先要保证的是运算精度。

CUDA
NVIDIA现在已经有了一个针对GPGPU的解决方案,被称作Compute Unified Device Architecture,简称CUDA。CUDA是一个完整的解决方案,包含了API、C编译器等,能够利用G80的片内L1 Cache共享数据,使数据不必经过内存-显存的反复传输,shader之间甚至可以互相通信。对数据的存储也不再约束于以往GPGPU的纹理方式,存取 更加灵活,可以充分利用stream out特性。以上几点都将大大提高GPGPU应用的效率。不过,CUDA的的细节还在保密中,更加具体的东西现在还没有透露。

 


五.理论性能测试和结果分析

很遗憾的是,笔者跑遍了国外的大小网站论坛,但包括GPGPU.org官方网站都没有给出一个能在G80上正常运行的GPGPU benchmark,因此,我们只有找到权威的GPU底层分析软件GPUbench来测试G80在GPGPU方面的理论性能了

test1. Streaming: Basic Throughput

Basic Troghput Float1 Float2 Float3 Float4
Mpixel/S 9286.24 4613.72 2305.75 2321.11
GB/S 37.12 36.23 27.53 36.89


这个测试反应了GPU的底层基础成绩
可以看到,因为是基于MIMD流水线体系,所以在FLOPS方面,G80相对目前基于SIMD体系流水线的GPU领先幅度不是很大,但这些强悍的FLOPS依旧表明了G80强大的浮点运算基础能力,是一块非常有通用扩展潜力的GPU

test2. 4-Component Floating Point Input Bandwidth (float4)

4-Component Floating Point Input Bandwidth(Float4)
SGL SEQ DEP
136.3291GB/S 55.1381GB/S 11.0740GB/S


这个测试项目反映了G80在tex cache hit(纹理缓存命中),既内部带宽完全发挥后的填充率。其中DEP表示采用的是Displacement Mapping。对于通用计算程序来说,一块GPU的片内cache带宽也是很重要的指标,充沛的带宽和容量能大大减轻运算压力

test3. Bandwidth: MRT Output bandwith (float4)

Bandwidth:MRT Output bandwith(float4)
1 outputs 1 RT 4 outputs 1 RT 4 outputs 4 RT
50.8691GB/S 50.9440GB/S 50.0529GB/S


这个项目反映了GPU的多目标输出能力。在通用计算过程中,MRT(Multi Render Target)是一种重要的渲染方式。可以看到,G80在4 outputs下同时对进行4目标渲染输出,性能依然没有变化

test4. Cache Hit Fetch Cost

Cache hit fetch cost(ms)
1 fetch

1 ALU

0.0771

10 ALU

0.0861

20 ALU

0.1743

40 ALU

0.3608

60 ALU

0.5336

2 fetch

4 ALU

0.0772

12 ALU

0.0871

24 ALU

0.1759

40 ALU

0.3627

60 ALU

0.5339

4 fetch

7 ALU

0.1136

15 ALU

0.1145

30 ALU

0.1889

45ALU

0.3970

60 ALU

0.5334

 


这个项目反映了在tex cache hit(纹理缓存命中)的情况下,GPU流水线对于各种着色指令比例的适应情况
设置如下:单个shader内包含tex fetch在内的指令数:1-60;texture保持一致;测试中循环渲染的时间为2ms

test5. Bandwidth: Readback

Bandwidth:Readback
FIXED RGBA 815.39MB/S
FIXED BGRA 1195.57MB/S
FOLAT RGBA 1499.91MB/S
FOLAT BGRA 1109.25MB/S


这个项目所反映的是Readback的带宽,一共使用了4种不同的数据格式。在GPU执行通用计算的时候,因为经常要进行回写处理,Readback带宽也是一个重要性能指标

test6. Instruction Issue

Instuction Issue
add 35.7067GB/S
sub 35.8620GB/S
mul 35.0777GB/S
mad 39.3408GB/S
Ex2 25.3032GB/S
Lg2 38.1223GB/S
pow 12.2813GB/S
flr 34.4193GB/S
frc 15.0068GB/S
rsg 38.0749GB/S
rcp 218.0402GB/S
sin 25.2945Gb/S
cos 25.3437GB/S
scs 24.5620GB/S
dp3 39.0509GB/S
xpd 21.3213GB/S
cmp 11.7684GB/S

 


这个项目表示了GPU的基本指令吞吐能力,是非常重要的参考指标

test7. Branching: PS30
很遗憾,G80目前的驱动还不足以正常跑完这个测试,每次跑出来的结果都令人匪夷所思,差距甚大。所以笔者只能放弃这个非常重要的测试项目,希望以后的测试中能够补上

六.结论

由于图形硬件发展很快,一些新特性还在不断出现,GPGPU的周遍开发平台也在不断完善。如今,GPGPU已经悄然进入了我们的生活。基于GPU的硬件HDTV解码,就是典型的GPGPU应用范例

Gelato_CPU render

2008年12月12日 - liqix - Liqix的程序世界

folfong

2008年12月12日 - liqix - Liqix的程序世界

 

值得回味的是,几年来GPU在通用计算上所开辟的应用及相关研究工作很像是其发展的一个副产品,而如今大有赶超 GPU本身应用势头的趋势。可谓是一项无心插柳柳成荫的典型。也许在不久的将来,人们使用GPU进行通用处理加速就像使用CPU集成的SSE浮点加速器一 样简单--这将是一件让所有人都受益匪浅的事,因为价格并不高昂的GPU已经能够可以纳入计算机的常规配置。小熊在线www.beareyes.com.cn

  评论这张
 
阅读(312)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017