应时而生的GPU
英文全称Graphic Processing Unit的GPU是现今PC DIY领域最火爆的词汇之一。GPU即图形处理器,是从CPU(中央处理器)衍生出来的的一个概念,它是显卡的心脏,和显卡板载内存成为一个子系统,共同决定PC系统的图形处理性能。越来越多的图形应用驱使在现代的计算机中GPU变得越来越重要,这种芯片在CPU主宰PC性能走向几十年后的近两年中迅速崛起,升势差不多达到了和CPU平起平坐的地位。
上个世纪的绝大多数显示加速芯片并不能称为GPU,因为它们仅有填充像素和纹理的功能。NVIDIA公司在1999年发布GeForce 256图形处理芯片时首先提出GPU的概念。GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作,尤其是在3D图形处理时。GPU所采用的核心技术有硬件T&L、立方环境材质贴图和顶点混合、纹理压缩和凹凸映射贴图、双重纹理四像素256位渲染引擎等,而硬件T&L技术可以说是GPU问世的标志。
● T&L和Shader
T&L(Transform. and Lighting,多边形转换与光源处理)是3D渲染中的一个重要部分,其作用是计算多边形的3D位置和处理动态光线效果,也可以称为几何处理。在GeForce问世之前,T&L的大部分运算是交由CPU处理的,由于CPU的任务繁多,除了T&L之外,还要做内存管理、输入响应等非3D图形处理工作,因此T&L性能低下,转交给GPU做这一部分大大改进了PC的整体图形性能。
GPU的下一次重大改进是引入Shader(着色器),Shader是配合DirectX 8的规格产生的图形芯片架构技术,它进一步扩展了GPU的能力,使原来的渲染管线和T&L带有了可编程的能力,极大地增强了GPU绘制出来的3D图形的表现力。从GeFroce 3一直到现在的GeForce 9,GPU的发展一直基于这种用于控制显卡硬件几何构建/渲染过程的Shader来延续的。
早期版本的shader有两种, 一种是顶点级的,称为vertex shader(OpenGL称为vertex program),取代固定渲染管线中的变换和光照部分,程序员可以自己控制顶点变换、光照等。一种是像素级的,称为pixel shader(OpenGL称为fragment program),取代固定渲染管线中的光栅化部分,程序员可以自己控制像素颜色和纹理采样等。
● 统一渲染架构
DirectX 10+GeForce 8,我们迎来了GPU新的一页,统一渲染架构。在06年底出现的这种新技术和产品中,顶点、像素、几何处理等各种其他3D处理都能被映射成浮点处理被GPU的流处理器(SPs:Streaming Processors)计算。几何着色处理是DirectX 10的新特性,这种功能统一渲染架构的的流处理器可以很好的支持,以此实现更加丰富的特效,并大大降低几何处理对CPU的依赖。GPU的分遣控制逻辑可以动态的分配流处理器去执行前面所述的顶点、像素和几何着色部分,甚至对于3D开发者来讲都不用过多的考虑不同着色器的分配,现在这些完全都可以交给API和驱动自动控制。
这种新的GPU流处理器的通用性良好,未来更多的3D应用也可以在API和驱动的支持下被加进来,就这一点来说统一架构的着色器也远优于不可扩展的传统架构。
在传统的管线模型里,数据流的开始是各种不同从CPU至GPU的属性、指针、命令和纹理。然后主要的处理阶段遵循相当线性方式,包括顶点着色、像素着色、栅格化,一直到完成处理的像素输入到缓冲区。事实上Geforce 7系列GPU的物理管线在每一个主要处理阶段都拥有很多子阶段,在像素着色阶段就有着超过200个分步的子阶段 。在统一的管线/着色器架构里,Geforce 8/9 GPU的设计显著的降低了管线处理阶段,并且把顺序流方式改成了循环执行。信号被输入到统一着色器核心处理后输出至寄存器,然后再被重复输入至着色器核心进行下一步处理。
深入图形程序,通常来说都是像素着色应用多于顶点着色应用,这也是早先着色器分离架构中像素着色器多于顶点着色器的原因。不过这只是总体上的统计情况,而在具体3D应用程序中,某个时段还是有所不同。因此,统一着色器架构的GPU的动态着色器处理能力将比传统的着色器分离架构更有效率。
GPU通用计算和未来
GPU所有计算均使用浮点算法,而且目前还没有位或整数运算指令。此外,由于GPU专为图像处理设计,因此存储系统实际上是一个二维的分段存储空间,包括一个区段号(从中读取图像)和二维地址(图像中的X、Y坐标)。此外,没有任何间接写指令。输出写地址由光栅处理器确定,而且不能由程序改变。这对于自然分布在存储器之中的算法而言是极大的挑战。
尽管有上述约束,但是GPU还是可以有效地执行多种运算,从线性代数和信号处理到数值仿真。虽然概念简单,但新用户在使用GPU计算时还是会感到迷惑,因为GPU需要专有的图形知识。这种情况下,一些软件工具可以提供帮助。两种高级描影语言CG和HLSL能够让用户编写类似C的代码,随后编译成碎片程序汇编语言。
在PC技术领域,CPU和GPU始终是相辅相成,在二者已经发展到出现新的瓶颈时,结合也许是明智的解决方案,因此,关于整合CPU和GPU的方案就一直被人们所津津乐道。在刚刚过去的2007年,NVIDIA率先引入了Tesla通用GPU计算架构,最终目的是将CPU和GPU合二为一,然而NVIDIA并没有CPU的研发历史,在整合的道路上遇到了重重困难。
如果能够发挥GPU的性能潜力,让它协助CPU处理复杂的任务,比如CPU负责一般任务计算,而GPU则负责专门浮点计算,这样就可以解决未来CPU发展的性能瓶颈。为此,通用“CPU-GPU”计算构架被一致看好,但实现二者的整合有两个途径:CPU整合GPU,或GPU集成CPU。就目前的情况来看,尽管PCI-E总线的带宽虽高,但始终未能满足CPU与GPU之间频繁的数据交换 工作 ,加上GPU受PCI-E总线的限制,GPU集成CPU还不够成熟,CPU整合GPU才是最终出路,由于CPU通用处理器的设计,令它得以应付日常生活形形色色的工作,所以它与GPU的关系是并存的。
尽管CPU整合GPU成为未来发展趋势,但至少可以肯定,在2009之前,对应产品不会上市,此外,CPU与GPU整合看起来容易,但实际遇到的问题还很多,比如现有主流GPU内建的晶体管目数目达到7亿之多,比CPU还要复杂,这意味着CPU还难以集成高端GPU内核。就算以后能集成高端的GPU,但GPU的发热量比CPU大许多,也是一个亟待解决的问题。