图形硬件的简单历史:
GPU(Graphic Processing Unit) 中文名图形处理器。20世纪六、七十年代,受图形硬件的限制,图形显示器只是计算机输出的一种工具。受硬件的发展水平,人们只是纯粹的从软件角度考虑计算机图形界面的规范问题。此时还没有GPU。
Programmable Graphics Processing Unit(GPU),即可编程图形处理单元,通常也称之为可编程图形硬件。GPU概念在20世纪70年代末和80年代初被提出,使用单片集成电路(monolithic)作为图形芯片,此时的GPU已经被用于视频游戏和动画方面,它能够很快地进行几张图片的合成(仅限于此)。在20世纪80年代末到90年代初这段时间内,基于数字信号处理芯片(digital signal processor chip)的GPU被研发出来,与前代相比速度更快、功能更强,当然价格是非常的昂贵。在1991年,S3 Graphics公司研制出第一个单芯片2D加速器,到了1995年,主流的PC图形芯片厂商都在自己的芯片上增加了对2D加速器的支持。与此同时,固定功能的视窗加速器(fixed-function Windows accelerators)由于其高昂的价格而慢慢退出PC市场。
1998年NVIDIA公司宣布modern GPU的研发成功,标志着GPU研发的历史性突破成为现实。通常将20世纪70年代末到1998年的这一段时间称之为pre-GPU时期,而自1998年往后的GPU称之为modern GPU。在pre-GPU时期,一些图形厂商,如SGI、Evans & Sutherland,都研发了各自的GPU,这些GPU在现在并没有被淘汰,依然在持续改进和被广泛的使用,当然价格也是非常的高昂。
modern GPU使用晶体管(transistors)进行计算,在微芯片(microchip)中,GPU所使用的晶体管已经远远超过CPU。例如,Intel在 2.4GHz的Pentium IV上使用5千5百万(55 million)个晶体管;而NVIDIA在GeForce FX GPU上使用超过1亿2千5百万(125 million)个晶体管,在NVIDDIA 7800 GXT上的晶体管达到3亿2百万(302 million)个。
回顾Modern GPU的发展历史,自1998年后可以分为4个阶段。NVIDIA于1998年宣布Modern GPU研发成功,这标志着第一代Modern GPU的诞生,第一代Modern GPU包括NVIDIA TNT2,ATI的Rage和3Dfx的Voodoo3。这些GPU可以独立于CPU进行像素缓存区的更新,并可以光栅化三角面片以及进行纹理操作,但是缺乏三维顶点的空间坐标变换能力,这意味着“必须依赖于GPU执行顶点坐标变换的计算”。这一时期的GPU功能非常有限,只能用于纹理组合的数学计算或者像素颜色值的计算。
从1999到2000年,是第二代modern GPU的发展时期。这一时期的GPU可以进行三维坐标转换和光照计算(3D Object Transformation and Lighting, T&L),并且OpenGL和DirectX7都提供了开发接口,支持应用程序使用基于硬件的坐标变换。这是一个非常重要的时期,在此之前只有高级工作站(workstation)的图形硬件才支持快速的顶点变换。同时,这一阶段的GPU对于纹理的操作也扩展到了立方体纹理(cube map)。NVIDIA的GeForce256,GeForce MAX,ATI的Radeon 7500等都是在这一阶段研发的。
2001年是第三代modern GPU的发展时期,这一时期研发的GPU提供vertex programmability(顶点编程能力),如GeForce 3,GeForce 4Ti,ATI的8500等。这些GPU允许应用程序指定一个序列的指令进行顶点操作控制(GPU编程的本质!),这同样是一个具有开创意义的时期,这一时期确立的GPU编程思想一直延续到2009年的今天,不但深入到工程领域帮助改善人类日常生活(医疗、地质勘探、游戏、电影等),而且开创或延伸了计算机科学的诸多研究领域(体绘制、光照模拟、人群动画、通用计算等)。同时,Direct8和OpenGL都本着与时俱进的精神,提供了支持vertex programmability的扩展。不过,这一时期的GPU还不支持像素级的编程能力,即fragment programmability(片段编程能力),在第四代modern GPU时期,我们将迎来同时支持vertex programmability和fragment programmability的GPU。
第四代modern GPU的发展时期从2002年末到2003年。NVIDIA的GeForce FX和ATI Radeon 9700同时在市场的舞台上闪亮登场,这两种GPU都支持vertex programmability和fragment programmability。同时DirectX和OpenGL也扩展了自身的API,用以支持vertex programmability和fragment programmability。自2003年起,可编程图形硬件正式诞生,并且由于DirectX和OpenGL锲而不舍的追赶潮流,导致基于图形硬件的编程技术,简称GPU编程,也宣告诞生。恭喜GeForce和ATI的硬件研发人员,你们终于可以歇口气了,不用较着劲地出显卡了,同时也恭喜 DirectX和OpenGL的研发人员,你们也可以休息下了,不用斗鸡一般的工作了,最后恭喜广大工作在图形图像领域的程序员,你们可以继续学而不倦。
目前最新的可编程图形硬件已经具备了如下功能:
1. 支持vertex programmability和fragment programmability;
2. 支持IEEE32位浮点运算;
3. 支持4元向量,4阶矩阵计算;
4. 提供分支指令,支持循环控制语句;
5. 具有高带宽的内存传输能力(>27.1GB/s);
6. 支持1D、2D、3D纹理像素查询和使用,且速度极快;
7. 支持绘制到纹理功能(Render to Texture,RTT)。
(摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”第一章。)
可编程GPU
TL变换 T 指 Transform ,L指Lighting,也就是对顶点进行变换,对模型进行光照处理,叫做变换光照流水线 。
Vertex 即我们熟悉的组成3D图形的顶点,设计3D模型是基于坐标空间内部设计的,Vertex信息包含了3D模型在空间内的坐标等信息。 Vertex Shader 则是对于Vertex信息的运算编程器,可以通过赋予特定的算法而在工作中改变3D模型的外形,Vertex Shader顶点运算单元可以直接检索显存中的材质数据。对于复杂的的场景中的大量的材质和多边形,顶点材质技术可以极大的提高GPU在处理复杂的游戏场景时的效率。并且还可以使用Vertex Shader这一特性实现很多炫酷的特效。
GPU的优点和缺点
GPU的优越性, 由于GPU具有高并行结构,在GPU处理图形数据和复杂算法方面拥有比CPU更高的效率。CPU大部分面积为控制器和寄存器,GPU拥有更多的ALU(Arithmetic Logic Unit),逻辑运算单元,用于数据处理。这样的结构适合对密集型数据进行并行处理。
GPU采用流式并行计算模式,可对每个数据进行独立的并行计算,即流内任意元素的计算不依赖于其它同类型数据,如计算一个顶点的世界位置坐标,不依赖于其它顶点的位置。所谓并行计算是指 多个数据并行运算的时间和1个数据单独执行的时间是一样的。所以在顶点处理程序中,可以同时处理N个顶点数据。
GPU逻辑单元多 CPU还需要控制器,缓存器。
GPU 的缺陷 由于“任意一个元素的计算不依赖于其它同类型数据”,导致“需要知道数据之间相关性的”算法,在GPU上很难实现。一个典型的例子就是射线与物理的求交运算。GPU中控制器少于CPU,致使控制能力有限。另外,进行GPU编程必须掌握计算机图形学相关知识,以及图形处理API,入门门槛高,学习周期较长,尤其国内关于GPU编程的质料较为匮乏,这些都导致了学习难度的增加。在早期,GPU编程只能使用汇编语言,开发难度高、效率低,不过,随着高级shader language的兴起,在GPU上编程已经容易多了
终结: 2003年开始正式进入可编程GPU阶段,GPU的并行处理能力强于CPU,目前GPU无法代替CPU